使用 ggplot 在折线图中仅绘制 x 轴上的日期向量的值
Posted
技术标签:
【中文标题】使用 ggplot 在折线图中仅绘制 x 轴上的日期向量的值【英文标题】:Plotting only the values of a date vector on x-axis in a line plot using ggplot 【发布时间】:2020-11-04 18:42:43 【问题描述】:我想在 x 轴上制作一个仅包含日期变量值的折线图,但 ggplot 正在绘制所有值,这些值正在填充我的数据中的缺失值,这是我不想要的。
这是我数据的一部分:
f <- structure(list(o = c(
"2020-01-02", "2020-01-03", "2020-01-06",
"2020-01-07", "2020-01-08", "2020-01-09", "2020-01-10", "2020-01-13",
"2020-01-14", "2020-01-15", "2020-01-16", "2020-01-17", "2020-01-21",
"2020-01-22", "2020-01-23", "2020-01-24", "2020-01-27", "2020-01-28",
"2020-01-29", "2020-01-30"
), val = c(
72.83, 75.56, 75.55, 75.98,
74.84, 77.17, 79.75, 83.72, 84.61, 85.8, 85.89, 83.63, 87.75,
91.81, 95.06, 100.79, 103.21, 106.62, 99.29, 93.55
), i.hold = c(
0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L
), equity.val = c(
72.83, 72.83, 72.83, 72.83, 72.83,
72.83, 72.83, 72.83, 72.83, 73.85432, 73.93179, 71.98644, 75.53283,
79.02756, 81.82508, 86.75731, 88.84038, 91.77562, 85.46615, 80.52531
), ma_5 = c(
NA, NA, NA, NA, 74.952, 75.82, 76.658, 78.292, 80.018,
82.21, 83.954, 84.73, 85.536, 86.976, 88.828, 91.808, 95.724,
99.498, 100.994, 100.692
), ma_10 = c(
NA, NA, NA, NA, NA, NA,
NA, NA, NA, 78.581, 79.887, 80.694, 81.914, 83.497, 85.519, 87.881,
90.227, 92.517, 93.985, 94.76
)), row.names = c(NA, -20L), class = "data.frame")
NA 值不是问题。所以,o 是我的日期变量,我想在 5 个日期后在 x 轴上绘制主要中断(x 轴上的网格线)。例如,第一次休息在 2020 年 1 月 2 日,第二次在 2020 年 1 月 9 日,第三次在 2020 年 1 月 16 日,第四次在 2020 年 1 月 24 日等等。我还希望数据中的每个日期都有小中断(x 轴上的网格线)。 你可以在这里找到数据集 - https://drive.google.com/file/d/1bvys_S4ZoyYBXaD4lXdAtY0GO88mWL79/view?usp=sharing
这是我的代码-
ggplot(f, aes(x = o, y = val)) +
geom_line(colour = "blue", lwd = 1) +
geom_segment(aes(y = -Inf, yend = Inf, x = f$o, xend = f$o, alpha = f$i.hold),
inherit.aes = F, colour = "black", size = 5) +
scale_alpha_continuous(range = c(0, 0.15)) +
guides(alpha = F) +
geom_line(aes(y = ma_10), colour = "green", lwd = 1) +
geom_line(aes(y = ma_5), colour = "red", lwd = 1) +
geom_line(aes(y = equity.val), lwd = 1) +
theme_bw() +
labs(x = "Dates", y = "Price") +
ggtitle("TXG") +
theme(plot.title = element_text(hjust = 0.5),
axis.text.x = element_text(angle = 90),
panel.grid.major.x = element_line(colour = "black", size = 0.6),
panel.grid.minor.x = element_line(colour = "black", size = 0.3)) +
scale_x_date(breaks = seq(as.Date(f$o[1]), as.Date(f$o[length(f$o)]), by = 5),
minor_breaks = seq(as.Date(f$o[1]), as.Date(f$o[length(f$o)]), by = 1),
date_labels = "%Y-%m-%d")
所以我的代码发生了什么,gg-plot 显示连续日期,即使是那些不在数据中的日期。 这是我的结果的图像-
我只想要我的日期变量中的那些。我不想在我的情节中有任何额外的日期。我想要格式为 YYYY-MM-DD 的日期。
我在这里尝试了答案-Breaks for scale_x_date in ggplot2 and R,但在我的情况下它不起作用。 任何其他答案将不胜感激。提前谢谢你。
【问题讨论】:
嗨,OP。欢迎来到 SO!你能通过dput(f)
分享你的数据集吗?该函数的输出应以structure(...
开头,并且可以直接复制并粘贴到您的问题(格式为代码)中,以代替您发布的文本,这些文本不容易复制。如果数据集太大,您还可以复制并粘贴dput(head(f, 10))
或类似内容的输出。另外,你可以张贴你的情节图片而不是分享谷歌驱动器链接吗? (不能总是访问)
嗨,欢迎来到 SO。使用提供的链接线程解决方案到底有什么不起作用?对我来说似乎很有帮助,或多或少是相同的问题。
这能回答你的问题吗? Breaks for scale_x_date in ggplot2 and R [这是一条自动评论,因为我将此问题标记为重复问题]
嗨,@chemdork123 我已经为代码添加了输出图像。数据只有 108 行。我为数据集添加了一个活动链接,您可以在其中访问数据集。您可以将我的输入文件读取为 CSV 并将其放入我的代码中以获取输出。
嗨@Tjebo 我收到此错误 - as.Date.numeric(value) 中的错误:必须提供“原点”。我的日期变量是日期类型,并且出现此错误。
【参考方案1】:
没有直观表示的日期间隔可能会产生误导!
只需将“limits”参数添加到您的 scale_x 调用中,并带有唯一的日期。这要求它们被正确排序,但如果它们以这种格式存储,它们应该是默认的。
此外,这里有很多线程来展示如何将多条线组合成一个图 - 使数据变长。然后您可以更方便地使用 scale_color_... 更改外观并减少冗余代码。
library(tidyverse)
flong <- f %>% pivot_longer(cols = matches("val|ma"), names_to = "key", values_to = "value")
unique_dates <- unique(flong$o)
ggplot(flong, aes(x = o, y = value)) +
geom_line(aes(color = key, group = key)) +
scale_x_discrete(limits = unique_dates, breaks = unique_dates) +
theme(axis.text.x = element_text(angle = 90))
#> Warning: Removed 13 row(s) containing missing values (geom_path).
【讨论】:
嗨@Tjebo,谢谢你的回答。我想要所有日期的输出。我希望在第 5 天进行主要休息,在每个日期进行次要休息。你能帮我解决这个问题吗? @TanmayGupta 不确定我是否理解您所说的“我想要包含所有日期的输出”的意思 - 认为这是您首先要避免的?以上是关于使用 ggplot 在折线图中仅绘制 x 轴上的日期向量的值的主要内容,如果未能解决你的问题,请参考以下文章