如何让ggplot为每个刻度线显示一个标签

Posted

技术标签:

【中文标题】如何让ggplot为每个刻度线显示一个标签【英文标题】:How to have ggplot show a label for each and every tick mark 【发布时间】:2021-04-01 11:54:37 【问题描述】:

这可能看起来很简单,但我发现的解决方案只会让它变得更加复杂。下面是我正在使用的可重现代码。有点迂回,但这是学习经历的一部分。在轴上使用 4 个标签添加比例 x 连续部分之前的结果。我需要显示每个时期(总共 24 个)。稍后我会担心文本的格式和角度,但在这一点上有点难过。包含 scale_x_continuous 项目后,我收到以下错误:

       Error in UseMethod("rescale") : 
       no applicable method for 'rescale' applied to an object of class "character"

       #Data generation
       Month1 <- c(201812,20191,20192,20193,20194,20195,20196,
        20197,20198,20199,201910,201911,201912,20201
        ,20202,20203,20204,20205,20206,20207
        ,20208,20209,202010,202011)
       annualjobgrowth<- c(44400,46000,42600,40500,42800,40500,36000,
                34000,32300,29900,21900,24500,21000,
                23300,16000,-6200,-275600,-249500,-149200,
                -136500,-129900,-122800,-113900,-109500)
       Rate <- 
       c(3.3,3.4,3.1,3.0,3.1,2.9,2.6,2.5,2.3,2.1,1.6,1.7,1.5,1.7,1.1,-0.4,
       -19.5,-17.6,-10.5,-9.6,-9.1,-8.6,-8.0,-7.7)
       cesyoy <- data.frame(Month1,annualjobgrowth, Rate)

      #Chart
      library(ggplot2)
      library(dplyr)
      library(lubridate)
      library(scales)


      cesyoy %>% mutate(year = substr(as.character(Month1),1,4),
              month = substr(as.character(Month1),5,7),
              date = as.Date(paste(year,month,"1",sep ="-"))) %>%
              ggplot() + geom_col(aes(x = date, y = annualjobgrowth))+
              scale_y_continuous()



    secondces<-cesyoy %>% mutate(year = substr(as.character(Month1),1,4),
                         month = substr(as.character(Month1),5,7),
                         date = as.Date(paste(year,month,"1",sep ="-"))) %>%
    ggplot() + geom_col(aes(x = date, y = annualjobgrowth),fill = "#00abff")+
    scale_y_continuous(labels=comma,breaks=c(50000,0,-50000,-100000,-150000,-200000,-250000))
    +scale_x_continuous(labels=as.character(x),breaks=x)+
    scale_fill_brewer(palette="Dark2")

【问题讨论】:

scale_x_date(date_breaks="1 month", date_labels="%b\n%Y") 是否提供您想要的结果?您可以调整 date_labels 参数以获得所需的特定日期格式。 @eipi10,这是代替 scale_x_continuous 还是补充它? 代替。对于给定的比例,您只能使用一个比例函数。如果您为 x 轴添加新比例,它将替换之前的 scale_x_***。因此,无论您想自定义 x 轴刻度,都可以在一次调用 scale_x_date 中完成。 @eipi10,您能否为此提供一个答案,以便您为此获得荣誉。感谢您的帮助。 我在下面添加了一个答案。 【参考方案1】:

使用scale_x_date 格式化日期轴。调整您的代码,我们可以执行以下操作:

cesyoy %>% 
  mutate(year = substr(as.character(Month1),1,4),
         month = substr(as.character(Month1),5,7),
         date = as.Date(paste(year,month,"1",sep ="-"))) %>%
  ggplot() + 
  geom_col(aes(x = date, y = annualjobgrowth)) +
  scale_x_date(date_breaks="1 month", date_labels="%b\n%Y")

我为日期标签选择了一种特定格式,但您可以通过调整 date_labels 参数来调整它。有关格式化代码和选项的详细信息,请参阅strftime 的帮助。

scale_x_date 代替scale_x_continuous,而不是作为它的补充。对于给定的比例,您只能使用一个比例函数。如果您为 x 轴添加新比例,它将替换之前的 scale_x_***。因此,无论您想自定义 x 轴刻度,都可以在一次调用 scale_x_date 中完成。

【讨论】:

谢谢,我想问问你是怎么把标签弄得这么干净的。我的标签堆叠在一起,因此难以辨认。 标签大小将取决于绘图中使用的字体大小(在我的情况下为默认大小)和渲染绘图的物理大小。例如,如果您将绘图保存为 500 x 300 像素的 png,然后以 1000 x 600 像素保存,您会看到文本与绘图区域的相对大小发生了变化。您需要调整字体大小(例如,theme(axis.text.x=element_text(size=12))theme(axis.text.x=element_text(size=rel(0.6)) 和图形渲染大小才能获得满意的结果。 最后一个,但你知道如何让标签不换行到第二行。一个字符串而不是一年之上的月份?如果没有,那没关系。你帮了大忙。 格式化字符串中的\n 是生成换行符的原因。例如,对于单行,您可以使用date_labels="%b %Y" 关于相对于绘图大小的文本大小,您可能会发现 this SO Q&A 很有帮助。

以上是关于如何让ggplot为每个刻度线显示一个标签的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2 x轴,每个值R的标签

如何在没有手动限制的情况下在一侧扩展 ggplot 条形刻度而不是另一侧

geom_mosaic:X 轴刻度标签未显示?

删除ggplot中的所有x轴标签[重复]

在ggplot2中更改轴文本的字体大小和方向

ggplot2用于带有两个相同刻度标签的条形图