使用 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 轴上的日期向量的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在折线图中的 X 轴和 Y 轴上给出点?

ggplot折线图中的多行x轴标签

绘制虚拟变量时,如何将 x 轴上的 0.0,1.0 更改为男性女性?

ggplot2:在离散轴上显示每第 n 个值

在剑道 UI 中如何在折线图中绘制垂直线

EXCEL的折线图中如何让X轴从0开始