ggplot2中的旋转和间隔轴标签


668

我有一个图,其中x轴是标签长的一个因素。虽然可能不是理想的可视化效果,但现在我想简单地将这些标签旋转为垂直。我已经用下面的代码弄清楚了这部分,但是如您所见,标签并不完全可见。

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + opts(axis.text.x=theme_text(angle=-90))

在此处输入图片说明

Answers:


1109

将最后一行更改为

q + theme(axis.text.x = element_text(angle = 90, hjust = 1))

默认情况下,即使旋转,轴也将在文本中心对齐。当您旋转+/- 90度时,通常希望它在边缘对齐:

替代文字

上面的图片来自此博客文章


95
在ggplot2的最新版本中,命令为: q + theme(axis.text.x=element_text(angle = -90, hjust = 0))
rnorberg 2012年

55
对于此处描述的行为不正常的人,请尝试theme(axis.text.x=element_text(angle = 90, vjust = 0.5))。从ggplot2 0.9.3.1开始,这似乎是解决方案。
lilster

42
实际上,我必须结合上述两种解决方案才能正确对齐标签:q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
jupp0r 2013年

32
@ jupp0r是正确的。theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))是目前正在使用的一种。

51
如果您想将标签旋转45度(更易于阅读)可以theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust=1))得到良好的效果
jan-glx 2015年

88

要使刻度标签上的文本完全可见并以与y轴标签相同的方向读取,请将最后一行更改为

q + theme(axis.text.x=element_text(angle=90, hjust=1))

81

采用 coord_flip()

data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

qplot(cut,carat,data = diamonds, geom = "boxplot") +
  coord_flip()

在此处输入图片说明


数据科学R的第3.9章中,Wickham和Grolemund谈到了这个确切的问题:

coord_flip()切换x和y轴。如果要水平框线图,这很有用(例如)。这对于长标签也很有用:在不重叠x轴的情况下很难使它们适应。


26

我想提供一个替代解决方案,因为引入了画布旋转功能,所以在最新版本的ggtern中需要类似于我将要提出的健壮解决方案。

基本上,您需要使用三角函数来确定相对位置,方法是构建一个函数,该函数返回element_text给定角度(即度)和位置(即x,y,顶部或右侧之一)信息的对象。

#Load Required Libraries
library(ggplot2)
library(gridExtra)

#Build Function to Return Element Text Object
rotatedAxisElementText = function(angle,position='x'){
  angle     = angle[1]; 
  position  = position[1]
  positions = list(x=0,y=90,top=180,right=270)
  if(!position %in% names(positions))
    stop(sprintf("'position' must be one of [%s]",paste(names(positions),collapse=", ")),call.=FALSE)
  if(!is.numeric(angle))
    stop("'angle' must be numeric",call.=FALSE)
  rads  = (angle - positions[[ position ]])*pi/180
  hjust = 0.5*(1 - sin(rads))
  vjust = 0.5*(1 + cos(rads))
  element_text(angle=angle,vjust=vjust,hjust=hjust)
}

坦率地说,我认为应该ggplot2hjustvjust参数提供一个“自动”选项,无论如何,当指定角度时,让我们演示上面的工作原理。

#Demonstrate Usage for a Variety of Rotations
df    = data.frame(x=0.5,y=0.5)
plots = lapply(seq(0,90,length.out=4),function(a){
  ggplot(df,aes(x,y)) + 
    geom_point() + 
    theme(axis.text.x = rotatedAxisElementText(a,'x'),
          axis.text.y = rotatedAxisElementText(a,'y')) +
    labs(title = sprintf("Rotated %s",a))
})
grid.arrange(grobs=plots)

产生以下内容:

例


1
我没有得到相同的结果,对我来说,使用自动方法无法很好地调整轴文本。但是,使用会rads = (-angle - positions[[ position ]])*pi/180产生更好的展示位置。注意角度之前的其他减号。无论如何,感谢您的代码:)
asac

7

ggpubr包提供一个快捷方式的默认操作(右对齐文本,中间对齐文本框中打勾)正确的事情:

library(ggplot2)
diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))
q <- qplot(cut, carat, data = diamonds, geom = "boxplot")
q + ggpubr::rotate_x_text()

reprex软件包(v0.2.1)创建于2018-11-06

在GitHub搜索中找到了相关的参数名称:https : //github.com/search?l=R&q= element_text+angle+90+vjust+org%3Acran&type =Code


5

或者,ggplot 3.3.0提供guide_axis(n.dodge = 2)(作为的guide参数scale_..或作为的x参数guides)以通过垂直避开标签来克服过度绘图问题。在这种情况下,效果很好:

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))

ggplot(diamonds, aes(cut, carat)) + 
  geom_boxplot() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2)) +
  NULL


1

要获得没有附加依赖项的可读x刻度标签,您想使用:

  ... +
  theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) +
  ...

这会将刻度线标签逆时针旋转90°,并使它们的末端(hjust = 1)垂直对齐,并使它们的中心与相应的刻度线(vjust = 0.5)水平对齐。

完整示例:

library(ggplot2)
data(diamonds)
diamonds$cut <- paste("Super Dee-Duper",as.character(diamonds$cut))
q <- qplot(cut,carat,data=diamonds,geom="boxplot")
q + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5))


请注意,该垂直/水平对齐参数vjust/ hjustelement_text是相对于文本。因此,vjust负责水平对齐。

没有vjust = 0.5它会像这样:

q + theme(axis.text.x = element_text(angle = 90, hjust = 1))

没有hjust = 1它会像这样:

q + theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

如果出于某些(有线)原因,您希望将刻度标签顺时针旋转90°(以便可以从左侧读取它们),则需要使用:q + theme(axis.text.x = element_text(angle = -90, vjust = 0.5, hjust = -1))

所有这些都已经在该答案的注释中进行了讨论,但是我经常回过头来回答这个问题,以至于我希望得到一个答案,我可以从中复制而无需阅读注释。


0

一种替代方法coord_flip()是使用该ggstance程序包。这样做的好处是可以更轻松地将图形与其他图形类型组合在一起,并且可能(更重要的是)为坐标系设置固定比例

library(ggplot2)
library(ggstance)

diamonds$cut <- paste("Super Dee-Duper", as.character(diamonds$cut))

ggplot(data=diamonds, aes(carat, cut)) + geom_boxploth()

reprex软件包(v0.3.0)创建于2020-03-11

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.