前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >数据处理神器tidyverse(2)ggplot2

数据处理神器tidyverse(2)ggplot2

作者头像
用户1359560
发布于 2019-08-29 02:19:41
发布于 2019-08-29 02:19:41
2.2K00
代码可运行
举报
文章被收录于专栏:生信小驿站生信小驿站
运行总次数:0
代码可运行

数据处理神器tidyverseggplot2

tidyverse包其中包含着一个重要的可视化包---ggplot2。 Ggplot2是由Hadley Wickham制作的数据可视化软件包,它基于一组称为图层的原则。 基本思想是ggplot2将数据的几何对象(圆圈,线条等),主题和比例放在上面。 几何对象的形式由geom_xxx()函数定义,基于数据变量的几何对象的属性(位置,大小,颜色)由美学(aes())函数指定( 在geom_xxx()函数中)。任何ggplot图的基础层都是由ggplot()函数定义的空ggplot层,它描述了用于绘图的数据框。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggplot(gapminder)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>% 
  filter(year == 2007) %>%
  ggplot()

这样输出的是空白图片

添加geom图层

接下来,我将向ggplot对象添加一个“geom”图层。使用+将图层添加到ggplot对象中。可能最常见的geom层是geom_point。 在geom_point()里面,您将指定从变量到所需几何对象的美学映射。 例如,如果你想在x轴上绘制带有gdpPercap的散点图,在y轴上绘制lifeExp,那么你可以添加一个带有相关美学函数的geom_point()几何图层:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# describe the base ggplot object and tell it what data we are interested in along with the aesthetic mapping
gapminder %>%
  filter(year == 2007) %>%
  ggplot() +
  # add a points layer on top
  geom_point(aes(x = gdpPercap, y = lifeExp))

我们还可以使用geom_smooth()在点上添加平滑的趋势线图层。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# describe the base ggplot object and tell it what data we are interested in along with the aesthetic mapping
gapminder %>%
  filter(year == 2007) %>%
  ggplot() +
  # add a points layer on top
  geom_point(aes(x = gdpPercap, y = lifeExp)) +
  # add a smoothed LOESS layer
  geom_smooth(aes(x = gdpPercap, y = lifeExp), method = "loess")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# describe the base ggplot object and tell it what data we are interested in along with the aesthetic mapping
gapminder %>%
  filter(year == 2007) %>%
  # specify global aesthetic mappings
  ggplot(aes(x = gdpPercap, y = lifeExp)) +
  # add a points layer on top
  geom_point() +
  # add a smoothed LOESS layer
  geom_smooth(method = "loess")

我们还可以将points geom图层与line geom图层或任何其他类型的geom图层组合在一起。 线图适用于绘制时间序列,因此下面我们使用点和线图层绘制平均预期寿命。在这里,你可以通过总结每年的预期寿命并将结果输入ggplot而不必定义任何中间变量来对dplyr操作与ggplot2进行一些巧妙的组合。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  # calcualte the average life expectency for each year
  group_by(year) %>%
  summarise(avg_lifeExp = mean(lifeExp)) %>%
  ungroup() %>%
  # specify global aesthetic mappings
  ggplot(aes(x = year, y = avg_lifeExp)) +
  # add a points layer on top
  geom_point() +
  # add a line layer on top
  geom_line()

如果你想在我们每个大陆的地块上有一条单独的线(而不是所有大陆的聚合线),你不需要为每个大陆添加一个单独的层来得到以下图:

相反,当您按年计算平均预期寿命时,首先按“大陆”分组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  group_by(continent, year) %>%
  summarise(avg_lifeExp = mean(lifeExp))

## # A tibble: 60 x 3
## # Groups:   continent [5]
##    continent  year avg_lifeExp
##    <fct>     <int>       <dbl>
##  1 Africa     1952        39.1
##  2 Africa     1957        41.3
##  3 Africa     1962        43.3
##  4 Africa     1967        45.3
##  5 Africa     1972        47.5
##  6 Africa     1977        49.6
##  7 Africa     1982        51.6
##  8 Africa     1987        53.3
##  9 Africa     1992        53.6
## 10 Africa     1997        53.6
## # … with 50 more rows

但是,如果您尝试使用与上面相同的代码在国家/地区年份分组数据框架上绘制一条线,则会得到一个奇怪的锯齿形图案。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  group_by(continent, year) %>%
  summarise(avg_lifeExp = mean(lifeExp)) %>%
  ungroup() %>%
  ggplot() +
  # add a points layer on top
  geom_point(aes(x = year, y = avg_lifeExp)) +
  # add a lines layer ontop
  geom_line(aes(x = year, y = avg_lifeExp))

发生这种情况是因为您现在每年都有多个平均预期寿命值,但您没有指定哪些值一起使用。 要修复此图,您需要通过在geom_line()图层的aes()函数中指定group = continent参数来指定行如何组合在一起(即哪个变量定义各行)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  group_by(continent, year) %>%
  summarise(avg_lifeExp = mean(lifeExp)) %>%
  ggplot() +
  # add a points layer on top
  geom_point(aes(x = year, y = avg_lifeExp)) +
  # add a lines layer on top that is grouped by continent
  geom_line(aes(x = year, y = avg_lifeExp, group = continent))

image

基于变量的更多美学映射

到目前为止,我们只指定了从数据到geom对象的x和y位置美学映射。 但您也可以指定其他类型的美学映射,例如使用变量来指定点的颜色。如果希望所有点都是相同的颜色,则可以指定全局点颜色参数(位于aes()函数之外)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  ggplot() +
  geom_point(aes(x = gdpPercap, y = lifeExp),
             col = "cornflowerblue")

但是,如果您想使用数据框中的变量来定义geoms的颜色(或任何其他美学特征),需要将它包含在aes()函数中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  ggplot() +
  geom_point(aes(x = gdpPercap, 
                 y = lifeExp, 
                 col  = continent))

请注意,continent变量本身不指定颜色:这是自动完成的。 您可以通过添加颜色的缩放图层来指定自己想要的颜色。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  ggplot() +
  geom_point(aes(x = gdpPercap, 
                 y = lifeExp, 
                 col  = continent)) +
  scale_colour_manual(values = c("orange", "red4", "purple", "darkgreen", "blue"))

我们还可以为其他功能添加美学映射,例如形状,大小,透明度(alpha)等等! 例如,根据人口改变大小:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  ggplot() +
  geom_point(aes(x = gdpPercap, y = lifeExp, 
                 col = continent, size = pop),
             alpha = 0.5)

对于上面的线图示例,我们绘制了每个大陆的平均预期寿命时间线,而不是指定“group”参数,您可以将colour参数指定为continent。 这将由continent自动分组和着色。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  group_by(continent, year) %>%
  summarise(avg_lifeExp = mean(lifeExp)) %>%
  # specify global aesthetic mappings
  ggplot() +
  # add a points layer on top
  geom_line(aes(x = year, y = avg_lifeExp, colour = continent))

其他类型的图层

到目前为止,我们只看到了散点图(点)和线图,但是,还有许多其他可以添加的geom,包括:

直方图

直方图仅需要指定X轴。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  ggplot() + 
  geom_histogram(aes(x = lifeExp), binwidth = 3)

箱图

要为箱形图着色,请使用fill参数而不是col(或color /colour)参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  ggplot() +
  geom_boxplot(aes(x = continent, y = lifeExp, fill = continent))

组合图片

您可以通过添加构面图层来创建由您选择的分类变量(例如“大陆”)分隔的图形的网格(或“构面”)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>%
  ggplot() +
  geom_point(aes(x = gdpPercap, y = lifeExp)) +
  facet_wrap(~continent, ncol = 2)

自定义ggplot2

虽然我们在这里保留了默认的ggplot2功能,但是你可以用ggplot2来做很多事情。 例如,通过练习,您将学习如何通过将多个层组合在一起来生成高度自定义的绘图。 作为动机,这里有一个更漂亮的情节可以用ggplot2制作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gapminder %>% 
  filter(year == 2007) %>%
  ggplot() +
  # add scatter points
  geom_point(aes(x = gdpPercap, y = lifeExp, col = continent, size = pop),
             alpha = 0.5) +
  # add some text annotations for the very large countries
  geom_text(aes(x = gdpPercap, y = lifeExp + 3, label = country),
            col = "grey50",
            data = filter(gapminder, year == 2007, pop > 1000000000 | country %in% c("Nigeria", "United States"))) +
  # clean the axes names and breaks
  scale_x_log10(limits = c(200, 60000)) +
  # change labels
  labs(title = "GDP versus life expectancy in 2007",
       x = "GDP per capita (log scale)",
       y = "Life expectancy",
       size = "Population",
       col = "Continent") +
  # change the size scale
  scale_size(range = c(0.1, 10),
             # remove size legend
             guide = "none") +
  # add a nicer theme
  theme_classic() +
  # place legend at top and grey axis lines
  theme(legend.position = "top")
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.08.28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
解密kafka为啥总是在重平衡
使用的是java SDK :kafka-clients:2.1.0, kafka版本:2.4.1
沐榕樰
2024/08/01
1920
基于kafka_2.11-2.1.0实现的生产者和消费者代码样例
遇到的坑,一开始报的错误莫名其妙,一开始以为使用的jar包版本问题,又是报slf4j的错误,又是报log4j的错误,又是报空指针的异常。最后百度意外遇到了可能是本地没有将ip地址放到hosts文件里面,果然是这个问题。
别先生
2019/06/03
2K0
Kafka笔记
3)注意路径问题,我将软件安装在 /opt/module下,你也可以安装在 /usr/local/下
CBeann
2023/12/25
1780
Kafka笔记
CKafka系列学习文章 - 云上消息队列它香不香?(十七)
一、先买买买,一个 1、供上购买链接:https://buy.cloud.tencent.com/ckafka?rid=1 2、先创建一个Ckafka实例 image.png image.png im
发哥说消息队列
2020/06/15
1.5K0
【Kafka】核心API
虚拟化软件推荐 VM https://www.cnblogs.com/PrayzzZ/p/11330937.html VirtualBOX
瑞新
2020/12/07
1.2K0
【Kafka】核心API
Kafka学习笔记-202102
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XX0kexvT-1617677731154)(D:\Code_Study\博客笔记\Kafka学习笔记.assets\1606809962993.png)]
用户8483969
2021/04/09
6120
Apache Kafka-初体验Kafka(04)-Java客户端操作Kafka
操作步骤 Maven依赖 核心依赖 kafka-clients <dependency> <groupId>org.apache.kafkagroupId>
小小工匠
2021/08/17
5680
第二天:Kafka API操作
Kafka的Producer发送消息采用的是异步发送的方式。在消息发送的过程中,涉及到了两个线程——main线程和Sender线程,以及一个线程共享变量——RecordAccumulator。main线程将消息发送给RecordAccumulator,Sender线程不断从RecordAccumulator中拉取消息发送到Kafka broker。
sowhat1412
2020/11/05
8200
第二天:Kafka  API操作
快速学习-Kafka API
Kafka 的 Producer 发送消息采用的是异步发送的方式。在消息发送的过程中,涉及到了两个线程——main 线程和 Sender 线程,以及一个线程共享变量——RecordAccumulator。main 线程将消息发送给 RecordAccumulator,Sender 线程不断从 RecordAccumulator 中拉取消息发送到 Kafka broker。
cwl_java
2020/02/24
7340
快速学习-Kafka API
大数据技术之_10_Kafka学习_Kafka概述+Kafka集群部署+Kafka工作流程分析+Kafka API实战+Kafka Producer拦截器+Kafka Streams
1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除)   点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息,而不是将消息推送到客户端。这个模型的特点是发送到队列的消息被一个且只有一个接收者接收处理,即使有多个消息监听者也是如此。
黑泽君
2019/03/15
1.2K0
Kafka从入门到进阶
如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
java架构师
2018/12/28
1.1K0
Apache Kafka 事务详解
Apache Kafka 是一个分布式流处理平台,主要用于实时数据的传输和处理。在现代的数据密集型应用中,事务性保证在数据传输和处理中的作用至关重要。本文将详细介绍 Kafka 的事务性支持,包括其基本概念、架构、使用方法以及相关代码示例和运行效果。
九转成圣
2024/08/05
1100
Kafka教程_图解kafka
推荐【Kafka教程】https://bigbird.blog.csdn.net/article/details/108770504 推荐【rabbitmq教程】https://bigbird.blog.csdn.net/article/details/81436980 推荐【Flink教程】https://blog.csdn.net/hellozpc/article/details/109413465 推荐【SpringBoot教程】https://blog.csdn.net/hellozpc/article/details/107095951 推荐【SpringCloud教程】https://blog.csdn.net/hellozpc/article/details/83692496 推荐【Mybatis教程】https://blog.csdn.net/hellozpc/article/details/80878563 推荐【SnowFlake教程】https://blog.csdn.net/hellozpc/article/details/108248227 推荐【并发限流教程】https://blog.csdn.net/hellozpc/article/details/107582771 推荐【JVM面试与调优教程】https://bigbird.blog.csdn.net/article/details/113888604
全栈程序员站长
2022/11/03
2K1
Kafka教程_图解kafka
kafuka生产者和消费者及配置
#kafka 生产者配置 #kafka 集群 kafka.bootstrap.servers=ip:端口 #发送端确认模式 kafka.acks=all #发送失败重试次数 kafka.retries =10 #批处理条数 kafka.batch.size=16384 #延迟统一收集,产生聚合,然后批量发送 kafka.linger.ms=100 #批处理缓冲区 kafka.buffer.memory=33554432 #key 序列化 kafka.key.serializer=org.apache.kafka.common.serialization.StringSerializer #value序列化 kafka.value.serializer=org.apache.kafka.common.serialization.StringSerializer #消费端 集群 kafka.bootstrap.servers=IP:端口 #一个用于跟踪调查的ID ,最好同group.id相同 kafka.client.id=MesSystem #Consumer归属的组ID kafka.group.id=debtorInfo #限制每回返回的最大数据条数 kafka.max.poll.records=1000 #是否自动提交 kafka.enable.auto.commit=false #自动提交的频率 kafka.auto.commit.interval.ms=1000 #会话的超时限制 kafka.session.timeout.ms=15000 kafka.key.deserializer=org.apache.kafka.common.serialization.StringDeserializer kafka.value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
全栈程序员站长
2022/09/05
1K0
kafka0.10client使用实例
序 本文主要讲一下怎么简单使用kafka0.10 client去收发消息 maven <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.10.2.1</version> <exclusions> <exclusion>
code4it
2018/09/17
7460
kafka教程_scala为什么用的很少
Kafka 是一个分布式的基于【发布/订阅模式】的消息队列(Message Queue),主要应用于 大数据实时处理领域。
全栈程序员站长
2022/11/19
6850
kafka教程_scala为什么用的很少
kafka中消费者消费消息之每个线程维护一个KafkaConsumer实例
3、kafka中消费者消费消息之每个线程维护一个KafkaConsumer实例:
别先生
2019/06/03
5360
如何使用Java连接Kerberos的Kafka
Kafka从0.8版本以后出了新的API接口,用于异步方式发送消息,性能优于旧的API,本篇文章主要使用新的API接口进行测试。继上一篇文章如何通过Cloudera Manager为Kafka启用Kerberos及使用,本篇文章主要讲述如何使用Java连接Kerberos的Kafka集群生产和消费消息。
Fayson
2018/03/29
4.8K0
如何使用Java连接Kerberos的Kafka
看完这篇Kafka,你也许就会了Kafka[通俗易懂]
Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么Kafka也就拥有消息队列的相应的特性了。
全栈程序员站长
2022/08/24
12.7K4
看完这篇Kafka,你也许就会了Kafka[通俗易懂]
5.Java Kafka Demo
到此一个最简单的demo 就可以运行起来了,当然,看起来简单,内部还有很多深层次的东西,我们会在后续谈到!
ParkJun
2020/07/14
2.5K0
相关推荐
解密kafka为啥总是在重平衡
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文