【问题标题】:How to get x axis text to have a vertical orientation (NOT rotated with angle=90/270)如何使 x 轴文本具有垂直方向(不以角度 = 90/270 旋转)
【发布时间】:2018-10-22 14:06:24
【问题描述】:

我希望我的 X 轴文本看起来像:

J
一个
n

不随字母旋转而旋转。

我想将其保留为日期轴。我知道我可以使用 "J\na\na\n" 的值使其离散。也许我可以在axis.text.x值上映射一个像这样的值向量?不过似乎应该有更简单的方法。

下面将演示该问题。我已经将它旋转了 90 度,但如上所示,这不是我想要的。

library(tidyverse)
library(scales)

y<- c(52014,51598,61920,58135,71242,76254,63882,64768,53526,55290,45490,35602)
months<-seq(as.Date("2018-01-01"),as.Date("2018-12-01"),"month")
dat<-as.tibble(cbind(y,months)) %>% 
  mutate(month=as.Date(months,origin="1970-01-01"))

ggplot(dat) +
  geom_line(aes(x=month,y=y)) +
  scale_x_date(breaks=date_breaks("month"),labels=date_format("%b")) +
  theme(axis.text.x=element_text(angle=90))

【问题讨论】:

  • 我会尝试,但我并没有假设我可以在日期类型列上使用字符串函数。 “Jan”“Feb”等来自使用scale_x_date(breaks="month")。
  • 也许使用labels 参数?此外,如果您提供一个可重现的最小示例,则更容易提供帮助。
  • 尝试了gsub函数方法,得到了一个似乎是由于列类型引起的错误。在我原来的问题中添加了一个示例。

标签: r ggplot2


【解决方案1】:

示例数据:

date <- seq(from = as.Date("2000-01-01"), to = as.Date("2000-12-01"), by = "month")
df <- data.frame(Month = date, Value = rnorm(12))

首先,生成一组您想要的自定义日期。这里我使用strsplit() 和lapply 来实现您的要求。(month.name 和month.abb 是R 中的本机字符向量)

mon.split <- strsplit(month.name, "")
mon <- unlist(lapply(mon.split, paste0, "\n", collapse = ""))
mon
 [1] "J\na\nn\nu\na\nr\ny\n"       "F\ne\nb\nr\nu\na\nr\ny\n"   
 [3] "M\na\nr\nc\nh\n"             "A\np\nr\ni\nl\n"            
 [5] "M\na\ny\n"                   "J\nu\nn\ne\n"               
 [7] "J\nu\nl\ny\n"                "A\nu\ng\nu\ns\nt\n"         
 [9] "S\ne\np\nt\ne\nm\nb\ne\nr\n" "O\nc\nt\no\nb\ne\nr\n"      
[11] "N\no\nv\ne\nm\nb\ne\nr\n"    "D\ne\nc\ne\nm\nb\ne\nr\n"

我认为您的日期变量是“日期”类,所以我使用 scale_x_date。如果是数字或字符,请使用scale_x_continuous 和scale_x_discrete。

ggplot(df, aes(x = Month, y = Value)) +
  geom_line() +
  scale_x_date(breaks = date, labels = mon)

【讨论】:

  • 谢谢。这是我认为可能的。我不知道month.name(这是R内置的某种常量吗?)。我将使用我发现也存在的month.abb。
  • 很高兴为您提供帮助。 month.name 和 month.abb 是 R 中的原生字符向量。
  • 如果其他人读到这个,breaks=date_breaks("month") 不起作用。我不得不把它切换到breaks=MY.DATE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多