前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言ggplot2做漂亮的抖动散点图(geom_jitter)的一个实例

R语言ggplot2做漂亮的抖动散点图(geom_jitter)的一个实例

作者头像
用户7010445
发布于 2021-12-09 04:40:01
发布于 2021-12-09 04:40:01
10K00
代码可运行
举报
运行总次数:0
代码可运行

在网上偶然间发现的一个R语言ggplot2做数据可视化的实例,提供数据和代码,今天的推文把代码拆解一下

实例数据下载链接

https://www.kaggle.com/berkeleyearth/climate-change-earth-surface-temperature-data?select=GlobalLandTemperaturesByCountry.csv

下载这个数据需要注册kaggle

代码链接

https://github.com/cnicault/30DayChartChallenge/blob/main/day12/day12_strips.Rmd

结果图

image.png

这个图展示的是法国1980年前后的温度差异,数据里提供很多个国家的数据,可以自己更改成其他国家的数据试试

首先是读取数据

这里接触了两个新的R包

  • vroom
  • here
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
climate <- vroom::vroom(here::here("GlobalLandTemperaturesByCountry.csv"))

关于lubridate包中的函数的一些用法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lubridate::year("1743-11-01")
lubridate::month("1743-11-01")
lubridate::month("1743-11-01",label = T)
lubridate::month("1743-11-01",label = F)
lubridate::day("1743-11-01")

构建作图的数据集

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(tidyverse)
monthly <- climate %>%
  filter(Country == "France", !is.na(AverageTemperature)) %>%
  mutate(year = lubridate::year(dt),
         month = lubridate::month(dt, label = TRUE),
         pos = lubridate::month(dt, label = FALSE),
         color = ifelse(year > 1980, "Recent", "Past")) %>%
  filter(year >=1900) 

他这里先做了一个空白的热图

注释里写的是为了得到一个矩形的图例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(ggplot2)
ggplot() +
  # empty tile to get a legend with rectangle key
  geom_tile(data = monthly, 
            aes(x = 0, y =0, width =0, 
                height = 0, fill = color))

image.png

接下来是添加线段

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seg <- tibble(x = c(0, 0, 10, 0, 9, 3, 8, 5, 6),
              xend = c(12.5, 3, 12.5, 5, 12.5, 6, 11, 10, 8),
              y = c(0, 5, 5, 10, 10, 15, 15, 20, 25),
              yend = c(0, 5, 5, 10, 10, 15, 15, 20, 25))

ggplot() +
  # empty tile to get a legend with rectangle key
  geom_tile(data = monthly, 
            aes(x = 0, y =0, 
                width =0, 
                height = 0, 
                fill = color)) +
  # y-axis
  geom_segment(data = seg, 
               aes(x = x, xend = xend,
                   y = y, yend = yend), 
               color = "red", 
               linetype = "12") 

image.png

添加文本注释

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
seg_lab <- tibble(x = c(0, 0, 0, 3, 5, 6),
                  y = seq(0,25, 5))
ggplot() +
  # empty tile to get a legend with rectangle key
  geom_tile(data = monthly, 
            aes(x = 0, y =0, 
                width =0, 
                height = 0, 
                fill = color)) +
  # y-axis
  geom_segment(data = seg, 
               aes(x = x, xend = xend,
                   y = y, yend = yend), 
               color = "black", linetype = "12") +
  geom_text(data = seg_lab, aes(x = x, y = y, 
                                label = glue::glue("{y} °C")), 
            color = "black", nudge_y = 1, 
            family = "serif", hjust = 0) 

image.png

添加抖动的散点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ggplot() +
  # empty tile to get a legend with rectangle key
  geom_tile(data = monthly, 
            aes(x = 0, y =0, 
                width =0, 
                height = 0, 
                fill = color)) +
  # y-axis
  geom_segment(data = seg, 
               aes(x = x, xend = xend, 
                   y = y, yend = yend), 
               color = "white", 
               linetype = "12") +
  geom_text(data = seg_lab, 
            aes(x = x, y = y, 
                label = glue::glue("{y} °C")), 
            color = "white", nudge_y = 1, 
            family = "serif", hjust = 0) +
  # show.legend = FALSE to remove the shape of the point in the legend
  geom_jitter(data = filter(monthly, color == "Recent"), 
              aes(x = pos+0.2, y = AverageTemperature, 
                  fill = color), width = 0.15,
              height =0, size = 3, shape = 21, 
              stroke = 0.3, color = "#FFDADC", 
              show.legend = FALSE) +
  geom_jitter(data = filter(monthly, color == "Past"), 
              aes(x = pos-0.2, y = AverageTemperature, 
                  fill = color), width = 0.15,
              height =0, size = 2.5, shape = 21, 
              stroke = 0.3, color = "#93E2F5", 
              show.legend = FALSE) 

image.png

接下来就是对细节的调整了

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
axis_labels <- tibble(month = lubridate::month(seq(1,12,1), 
                                               label = TRUE),
                      pos = seq(1,12,1))



txt_clr <- "white"
pal1 <- c("#105182", "#1a7bc5", "#42a2f1", "#E9F1F2", "#ff9193", "#f1434a", "#c91022", "#8d0613", "#4D030A")



monthly_plt <- ggplot() +
  # empty tile to get a legend with rectangle key
  geom_tile(data = monthly, 
            aes(x = 0, y =0, 
                width =0, height = 0, 
                fill = color)) +
  # y-axis
  geom_segment(data = seg, 
               aes(x = x, xend = xend, 
                   y = y, yend = yend), 
               color = "white", linetype = "12") +
  geom_text(data = seg_lab, 
            aes(x = x, y = y, label = glue::glue("{y} °C")), 
            color = "white", nudge_y = 1, 
            family = "serif", hjust = 0) +
  # show.legend = FALSE to remove the shape of the point in the legend
  geom_jitter(data = filter(monthly, color == "Recent"), 
              aes(x = pos+0.2, y = AverageTemperature, fill = color), 
              width = 0.15, height =0, size = 3, 
              shape = 21, stroke = 0.3, color = "#FFDADC", show.legend = FALSE) +
  geom_jitter(data = filter(monthly, color == "Past"), 
              aes(x = pos-0.2, y = AverageTemperature, fill = color), 
              width = 0.15, height =0, size = 2.5, 
              shape = 21, stroke = 0.3, color = "#93E2F5", 
              show.legend = FALSE) +
  # x-axis labels
  geom_text(data = axis_labels, 
            aes(x = pos, y = -2, label = month), 
            color = "white", vjust = 0, 
            angle = 90, size = 5, family = "serif")+
  # scales
  scale_fill_manual(values = c("Recent" = "#f1434a", "Past" = "#1a7bc5"), 
                    labels = c("Recent" = "> 1980", "Past" = "<= 1980")) +
  scale_y_continuous(limits = c(-4,26), 
                     breaks = seq(0,25,5)) +
  labs(fill = "Observations") +
  theme_void() +
  guides(fill = guide_legend(label.position = "top",
                             title.hjust = 0.5,
                             keyheight = unit(1, "line"),
                             keywidth = unit(4, "line"),
                             nrow = 1),
         color = FALSE) +
  theme(plot.background = element_rect(fill = "grey40", color = NA),
        legend.position = c(0.13, 0.85),
        legend.text = element_text(face = "bold", 
                                   size = 12, color = txt_clr),
        legend.title = element_text(face = "bold", size = 14, color = txt_clr))

monthly_plt

image.png

推文用到的示例数据和代码可以自己到推文开头提到的两个链接去下载

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小明的数据分析笔记本 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图解 & 深入浅出 JavaWeb:Servlet 再说几句
摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢!
二哥聊运营工具
2021/12/17
2250
图解 & 深入浅出 JavaWeb:Servlet 再说几句
Servlet的生命周期
HttpServletservice()http methodservletdoXXX
高大北
2022/06/14
1750
HttpServlet源码分析
1.HttpServlet的用法 提供了创建Http Servlet的抽象类,通过实现此类定义自己的Servlet 2.HttpServlet是否是线程安全 先说结论:HttpServlet不是线程安全 tomcat在只在第一次有请求的时候加载Servlet,加载之后调用init方法进行初始化,容器中只会保存一个Servlet对象,当有Http请求的时候会调用service方法对请求进行处理。所以Servlet不是线程安全的,当我们在Servlet中定义类变量或者处理共享资源时,要注意线程安全问题。简单的理
代码改变世界-coding
2018/07/03
3730
Java Servlet详解(体系结构+注解配置+生命周期)
顾名思义:服务端的小程序 Servlet只是一个接口,定义了Java被浏览器访问到(Tomcat)的识别规则,我们需要定义一个类来实现Servlet接口
一只胡说八道的猴子
2020/09/27
5020
Java Servlet详解(体系结构+注解配置+生命周期)
JavaWeb
将CATALINA_HOME/conf/logging.properties文件中的内容修改如下:
星辰xc
2022/05/11
6.3K0
JavaWeb
Spring mvc HTTP协议之缓存机制
概述 Spring MVC 支持HTTP协议的 Last-Modified 缓存机制。 在客户端地一次输入URL时,服务器端会返回内容和状态码200, 表示请求成功,同时会添加一个“Last-Modified”属性,表示该请求资源的最后修改时间 客户端第二次请求此URL时,客户端会向服务器发送请求头 “IF-Modified-Since”,如果服务端内容没有变化,则自动返回HTTP304状态码(只返回相应头信息,不返回资源文件内容,这样就可以节省网络带宽,提供响应速度和用户体验) Spring MVC 中实
java404
2018/05/18
9820
Servlet API 源码剖析
从目录出发,整个源代码分为 servlet、http、descriptor、annotation 四个部分。
FoamValue
2020/08/31
6650
设计模式 | 行为型 | 模板方法模式
模板方法模式是一种行为设计模式,它在一个超类中定义一个算法骨架,并将某些步骤推迟到子类中实现。
被水淹没
2023/02/25
1970
设计模式 | 行为型 | 模板方法模式
Java Servlet完全教程
Servlet 是一些遵从Java Servlet API的Java类,这些Java类可以响应请求。尽管Servlet可以响应任意类型的请求,但是它们使用最广泛的是响应web方面的请求。Servlet必须部署在Java servlet容器才能使用。虽然很多开发者都使用Java Server Pages(JSP)和 Java Server Faces(JSF) 等Servlet框架,但是这些技术都要在幕后通过Servlet容器把页面编译为Java Servlet。也就是说,了解Java Servlet技术的基础知识对任何Java web开发者来说是很有用的。
用户7353950
2022/05/11
4680
Java Servlet完全教程
Servlet详解
Servlet是server+Applet的缩写,表示一个服务器应用。Servlet就是一套规范,按照这套规范写的代码就可以直接在Java服务器上面运行。
秋白
2019/02/21
6090
Servlet详解
Java-Servlet请求方式doXXX、service 具体分析
说起Servlet的接收处理请求的方式,想必各位都并不陌生,如doGet、doPost、service...
Arebirth
2019/09/24
5430
Java-Servlet请求方式doXXX、service 具体分析
Servlet入门笔记
J2EE(Java 2 Platform Enterprise Edition)是指“Java 2 企业版”
Breeze.
2022/07/12
4190
Servlet入门笔记
重温Java Web的技术细节
-web应用同样也需要一些初始化的参数,但 相对于每一个Servlet有一个ServletConfig来说,一个Web应用(确切的说是每个JVM)仅有一个ServletContext来存放这些参数,这个ServletContext对Web应用中的每个Servlet都可用。
智慧zhuhuix
2020/09/01
1K0
重温Java Web的技术细节
SpringMVC源码解析从service到doDispatch
请求在被Servlet处理之前会先被过滤器处理,之后调用Servlet的service方法来对相应的请求进行处理响应。所以我们这里分析的入口是Servlet的service方法。
JavaEdge
2021/02/22
2580
SpringMVC源码解析从service到doDispatch
SpringMVC源码解析之Last-Modified缓存机制
支持上次修改的HTTP请求,以方便内容缓存。 相同的合同作为Servlet API中的getLastModified方法。 通过委派到org.springframework.web.servlet.HandlerAdapter.getLastModified实施。 默认情况下,任何控制器或HttpRequestHandler Spring的默认框架内可以实现此接口,以实现最后修改时间检查。 注:另类处理的实现方法有不同的最后修改的处理方式。 例如,Spring 2.5的(使用注释的控制器的方法@RequestMapping )通过提供上次修改支持org.springframework.web.context.request.WebRequest.checkNotModified方法,允许主处理程序方法中最后一次修改检查。
JavaEdge
2021/02/22
5510
SpringMVC源码解析之Last-Modified缓存机制
重拾Java Web应用的基础体系结构
一、背景 Spring生态的强大与完善,使得大多数的Java程序员,在刚刚接触Java Web应用开发时,往往依赖于SSM、SpringBoot等各种高级框架。 Java Web的基础的体系结构是什么?到底是怎么运作的?这些高级的框架与基础的体系结构之间是什么关系? 只有真正理清了这些底层基础的结构,才能完全理解高级框架的设计原理,在使用框架开发项目时做到事半功倍。 本文旨在暂时抛开这些高级框架,重走Java Web底层之路。二、Web应用 Web应用的基础模型 用户通过Web浏览器向某个Web应用发出一个
智慧zhuhuix
2020/08/26
5550
重拾Java Web应用的基础体系结构
【Servlet】浅谈一下Servlet的继承关系。
javax.servlet.GenericServlet实现了接口Servlet:
.29.
2022/11/15
4420
【Servlet】浅谈一下Servlet的继承关系。
重拾Java Web应用的基础体系结构
一、背景 Spring生态的强大与完善,使得大多数的Java程序员,在刚刚接触Java Web应用开发时,往往依赖于SSM、SpringBoot等各种高级框架。 Java Web的基础的体系结构是什么?到底是怎么运作的?这些高级的框架与基础的体系结构之间是什么关系? 只有真正理清了这些底层基础的结构,才能完全理解高级框架的设计原理,在使用框架开发项目时做到事半功倍。 本文旨在暂时抛开这些高级框架,重走Java Web底层之路。 二、Web应用 Web应用的基础模型 用户通过Web浏览器向某个Web应用发出一
智慧zhuhuix
2020/08/28
4490
重拾Java Web应用的基础体系结构
Java匹马行天下之JavaWeb核心技术——Servlet
Servlet是在服务器上运行的小程序,也就是一个Java类,但比较特殊,不需要new,自动就可以运行。也有创建、垃圾回收和销毁过程。Servlet是JavaWeb的三大组件之一(Servlet、Filter、Listener),它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
泰斗贤若如
2019/06/18
7500
Servlet的源码分析
4 .使用 ctrl+o 即可查看该类的所有属性与方法 注 : 每种图标代表不同的方法 ,像是第一个红色方框加SF 代表 private 类型的最终静态常量 ,其他类型如图所示
时间静止不是简史
2020/07/24
1.1K0
Servlet的源码分析
相关推荐
图解 & 深入浅出 JavaWeb:Servlet 再说几句
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验