r - 使用 ggplot 散布点
问题描述
我得到以下数据集:
Name Year-Month Value
A 2002-01 -3.45
A 2003-02 2.87
A 2004-05 1.78
A 2005-01 -9.54
B 2000-01 -1.45
B 2001-02 10.87
B 2002-01 5.78
C 2004-01 -6.45
C 2005-01 4.87
我想做的是我想以特殊的方式绘制值。在 x 轴上应该有年份和月份,但由于 2000 年至 2008 年之间的年份和月份有很多观察结果,我只想写出一年中的第一个月和六个月,而一年中的所有其他月份都是只是标有一个标志。
对于所有观察,我想像点或十字一样分散值,无论它们来自哪个字母。
这张图只是一个小插曲。在真实的情节中,这些值必须在年月所在的线上。
使用 ggplot2 或任何其他软件包有没有一种简单的方法?
解决方案
为了每 6 个月显示一次 x 轴标签,同时每个月显示次要刻度,我们需要一个小技巧:每个月制作主要刻度,但每 6 个月只显示一次标签。
要使用scale_x_date
,需要创建一个“假”Date
列Year-Month
。在这里,我只是将每月的第一天附加01
到现有Year-Month
列中。
library(magrittr)
library(tidyverse)
df <- read.table(text = "Name Year-Month Value
A 2002-01 -3.45
A 2003-02 2.87
A 2004-05 1.78
A 2005-01 -9.54
B 2000-01 -1.45
B 2001-02 10.87
B 2002-01 5.78
C 2004-01 -6.45
C 2005-01 4.87",
header = TRUE)
# Create a Date column so that scale_x_date can be used
df %<>%
as.tibble() %>%
mutate(Date = as.Date(paste0(Year.Month, "-01")))
df
#> # A tibble: 9 x 4
#> Name Year.Month Value Date
#> <fct> <fct> <dbl> <date>
#> 1 A 2002-01 -3.45 2002-01-01
#> 2 A 2003-02 2.87 2003-02-01
#> 3 A 2004-05 1.78 2004-05-01
#> 4 A 2005-01 -9.54 2005-01-01
#> 5 B 2000-01 -1.45 2000-01-01
#> 6 B 2001-02 10.9 2001-02-01
#> 7 B 2002-01 5.78 2002-01-01
#> 8 C 2004-01 -6.45 2004-01-01
#> 9 C 2005-01 4.87 2005-01-01
# Auto x-axis break
ggplot(df, aes(x = Date, y = Value)) +
geom_point(pch = 4, size = 5) +
scale_x_date(expand = c(0.015, 0.015),
breaks = scales::pretty_breaks(), date_labels = "%Y-%b") +
theme_bw()
# Break every 6 months
ggplot(df, aes(x = Date, y = Value)) +
geom_point(pch = 4, size = 5) +
scale_x_date(expand = c(0.015, 0.015),
date_breaks = "6 months", date_labels = "%Y-%b") +
theme_bw()
# Color by Name, manually setup date range
ggplot(df, aes(x = Date, y = Value, color = Name)) +
geom_point(pch = 4, size = 5) +
scale_x_date(expand = c(0.015, 0.015),
breaks = seq(min(df$Date), max(df$Date), by = "6 months"),
date_minor_breaks = "1 month",
date_labels = "%Y-%b") +
theme_bw()
# Add minor tick
# Trick: make major ticks for every month but only show labels every 6 months
labels_month = format(seq(from = min(df$Date), to = max(df$Date), by = "1 months"),
"%Y-%b")
labels_month[rep(c(FALSE, TRUE), c(1, 4))] <- ""
labels_month
#> [1] "2000-Jan" "" "" "" "" "2000-Jun"
#> [7] "" "" "" "" "2000-Nov" ""
#> [13] "" "" "" "2001-Apr" "" ""
#> [19] "" "" "2001-Sep" "" "" ""
#> [25] "" "2002-Feb" "" "" "" ""
#> [31] "2002-Jul" "" "" "" "" "2002-Dec"
#> [37] "" "" "" "" "2003-May" ""
#> [43] "" "" "" "2003-Oct" "" ""
#> [49] "" "" "2004-Mar" "" "" ""
#> [55] "" "2004-Aug" "" "" "" ""
#> [61] "2005-Jan"
x_breaks = seq(min(df$Date), max(df$Date), by = "1 months")
ggplot(df, aes(x = Date, y = Value, color = Name)) +
geom_point(pch = 4, size = 5) +
scale_x_date(expand = c(0.015, 0.015),
labels = labels_month,
breaks = x_breaks) +
theme_classic() +
theme(axis.text.x = element_text(angle = 90, vjust = 0.5))
由reprex 包(v0.2.0)于 2018 年 6 月 5 日创建。
推荐阅读
- php - 试图将数据传递给ajax函数,但不能
- google-cloud-platform - Google Cloud Platform Logging - 通过排除 liveness_check 和 readiness_check 来减少噪音
- r-markdown - 如何在 Bookdown 中创建自己的表格并在文本中引用它?
- javascript - 将悬停 jquery 代码转换为 javascript
- r - 在 R 中从 CHR 转换为 DATE
- python - 腌制一个动态创建的 Mixin 类
- sql - AWS Athena 中是否有将经度/纬度转换为 geohash 的功能?
- php - 在 PHP 中使用 DateTime 生成不同的日期字符串
- scipy - 安装过程中出现 python 3.10.0 和 scipy 错误
- r - 使用 odbc 从 R 中的活动连接导入 SQL 表