【问题标题】:How to show every second R ggplot2 x-axis label value?如何显示每秒 R ggplot2 x 轴标签值?
【发布时间】:2017-07-17 15:15:18
【问题描述】:

我想在演示文稿中显示 x 轴标签列表的每一秒。 下面的简化代码示例及其在图 1 中的输出,其中显示了四个日期,但应跳过 #2 和 #4。

# https://stackoverflow.com/a/6638722/54964
require(ggplot2)
my.dates = as.Date(c("2011-07-22","2011-07-23",
                     "2011-07-24","2011-07-28","2011-07-29"))
my.vals  = c(5,6,8,7,3)
my.data <- data.frame(date =my.dates, vals = my.vals)
plot(my.dates, my.vals)
p <- ggplot(data = my.data, aes(date,vals))+ geom_line(size = 1.5)

预期输出:跳过第二个和第四个日期。

实际代码

由于rev(Vars) 逻辑,我无法将as.Date 应用于每个类别中的值的实际代码;变量molten 有一列Dates

p <- ggplot(molten, aes(x = rev(Vars), y = value)) + 
    geom_bar(aes(fill=variable), stat = "identity", position="dodge") + 
    facet_wrap( ~ variable, scales="free") +
    scale_x_discrete("Column name dates", labels = rev(Dates)) 

预期输出:跳过每个类别中的 #2、#4、... 值。 我想在这里将scale_x_discrete 更改为scale_x_continuous 并在scale_x_continuous 中有一个中断序列breaks = seq(1,length(Dates),2)) 但由于以下错误而失败。

Error: `breaks` and `labels` must have the same length 

基于 Juan 的 cmets 的建议

代码

ggplot(data = my.data, aes(as.numeric(date), vals)) + 
  geom_line(size = 1.5) +
  scale_x_continuous(breaks = pretty(as.numeric(rev(my.data$date)), n = 5)) 

输出

Error: Discrete value supplied to continuous scale

将 EricWatt 的提案应用测试为实际代码

代码提案

p <- ggplot(molten, aes(x = rev(Vars), y = value)) + 
    geom_bar(aes(fill=variable), stat = "identity", position="dodge") + 
    facet_wrap( ~ variable, scales="free") +
    scale_x_discrete("My dates", breaks = Dates[seq(1, length(Dates), by = 2)], labels = rev(Dates))  

输出

Error: `breaks` and `labels` must have the same length 

如果你有scale_x_discrete("My dates", breaks = Dates[seq(1, length(Dates), by = 2)]),你会得到没有任何标签的 x 轴,所以空白。

图。 1 简化代码示例的输出, 图 2 EricWatt 的第一个提案的输出

操作系统:Debian 9
R:3.4.0

【问题讨论】:

  • 试试scale_x_continuous(breaks=pretty(rev(Vars), length(Vars)/2))
  • 对不起!除非您通过过于复杂的as.Date,否则这不适用于日期。 @EricWatt 的答案是你应该使用的。
  • 每个链接的答案,如果你打电话给as.numeric,例如ggplot(data=my.data, aes(as.numeric(date), vals)) + geom_line() + scale_x_continuous(breaks=pretty(as.numeric(rev(my.data$date)))),它就可以工作,但是你可能想添加标签,我觉得这太复杂了!
  • 抱歉,pretty需要指定断点数,所以加上pretty(..., n=4)
  • Here it is 带标签:ggplot(data=my.data, aes(as.numeric(date), vals)) + geom_line(size=1.5) + scale_x_continuous(breaks=pretty(as.numeric(rev(my.data$date)), n=4), labels=format(rev(my.data$date), format="%m/%d/%y"))

标签: r ggplot2 debian axis-labels


【解决方案1】:

这适用于您的简化示例。如果没有您的molten data.frame,就很难根据您更复杂的情节来检查它。

ggplot(data = my.data, aes(date, vals)) + 
  geom_line(size = 1.5) +
  scale_x_date(breaks = my.data$date[seq(1, length(my.data$date), by = 2)])

基本上,使用scale_x_date 可能会为您处理任何奇怪的日期到数字的转换。

【讨论】:

  • 它有一个刻度线和日期 1、3 和 5 的标签,跳过了 2 和 4。还有其他你期望的吗?
  • 你的日期是c("2011-07-22","2011-07-23", "2011-07-24","2011-07-28","2011-07-29")。 #2 和 #4 的日期是 "2011-07-23""2011-07-28"。这些是您要在 x 轴上跳过标签的日期。您想要显示的日期是"2011-07-22""2011-07-24""2011-07-29"。您根据我的代码提供的图像中的输出准确地显示了这些日期。我不明白您想要什么输出,但这正是您在问题中描述的内容。
  • 我使用了scale_x_date 而不是scale_x_discrete。也可以尝试去掉labels 参数。
  • 我无法测试您的实际代码,因为我没有 molten 数据。如果可重现的示例不能证明您遇到的问题,那么它不是一个很好的可重现示例。也许修改简化的示例,使其代表您正在尝试做的事情?
  • 我根据其他线程的实际数据和您的回答找到了解决方案。我在这里添加它作为 wiki 答案。
【解决方案2】:

我的解决方案最终基于另一个链接线程和 EricWatt 的回答所激发的实际代码

# Test data of actual data here # https://stackoverflow.com/q/45130082/54964

ggplot(data = molten, aes(x = as.Date(Time.data, format = "%d.%m.%Y"), y = value)) + 
  geom_bar(aes(fill = variable), stat = "identity", position = "dodge") +
  facet_wrap( ~ variable, scales="free") +
  theme_bw() + # has to be before axis text manipulations because disables their effect otherwise
  theme(axis.text.x = element_text(angle = 90, hjust=1), 
        text = element_text(size=10)) +
  scale_x_date(date_breaks = "2 days", date_labels = "%d.%m.%Y")

【讨论】:

  • 我更喜欢这个答案,因为“date_breaks”提供了一种更简单的方法来操作日期间隔,并且包含“date_labels”对格式化非常有用。
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 2021-06-12
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多