在ggplot2中更改字体大小和轴标签方向

266

我正在绘制一张图表,其中x轴是分类变量,y轴是数值变量。

对于x轴,由于有许多数据点,所以默认的文本格式会导致每个刻度标记的标签与其他标签重叠。我该如何(a)更改轴文字的字体大小和(b)更改文本的方向,使得文本垂直于轴?


还有一个问题 https://dev59.com/vWsz5IYBdhLWcg3wJUUo - Nikos Alexandris
与 https://dev59.com/mnM_5IYBdhLWcg3wjj0p 有重叠,但该问题未涉及调整文本大小。 - krlmlr
7个回答

379

使用theme()函数:

d <- data.frame(x=gl(10, 1, 10, labels=paste("long text label ", letters[1:10])), y=rnorm(10))
ggplot(d, aes(x=x, y=y)) + geom_point() +
    theme(text = element_text(size=20),
        axis.text.x = element_text(angle=90, hjust=1)) 
#vjust adjust the vertical justification of the labels, which is often useful

在这里输入图像描述

有很多关于如何格式化ggplots的好信息可以在这里找到。你可以使用?theme来查看可以修改的所有参数(基本上是所有参数)的完整列表。


2
我认为应该是 hjust=1 - Artem Sokolov
真的!根据 Artem 的评论进行了更正,但我没有更新图片。 - Drew Steen

94

同意 @Drew Steen 对于使用 theme() 的看法。这里是用于坐标轴文字和标题的常见主题属性。

ggplot(mtcars, aes(x = factor(cyl), y = mpg))+
  geom_point()+
  theme(axis.text.x = element_text(color = "grey20", size = 20, angle = 90, hjust = .5, vjust = .5, face = "plain"),
        axis.text.y = element_text(color = "grey20", size = 12, angle = 0, hjust = 1, vjust = 0, face = "plain"),  
        axis.title.x = element_text(color = "grey20", size = 12, angle = 0, hjust = .5, vjust = 0, face = "plain"),
        axis.title.y = element_text(color = "grey20", size = 12, angle = 90, hjust = .5, vjust = .5, face = "plain"))

34

除了之前的解决方案,您还可以使用rel()函数指定相对于主题中包含的base_size(例如theme_bw(),其中base_size为11)的字体大小。

例如:

ggplot(mtcars, aes(disp, mpg)) +
  geom_point() +
  theme_bw() +
  theme(axis.text.x=element_text(size=rel(0.5), angle=90))

22

使用theme()函数:

d <- data.frame(x=gl(10, 1, 10, labels=paste("long text label ", letters[1:10])), y=rnorm(10))
ggplot(d, aes(x=x, y=y)) + geom_point() +
theme(text = element_text(size=20))

10

如果需要制作多个图表,将其全局设置是有意义的(关键部分是第二行,三行组合是一个工作示例):

   library('ggplot2')
   theme_update(text = element_text(size=20))
   ggplot(mpg, aes(displ, hwy, colour = class)) + geom_point()

7

解决重叠标签的另一种方法是使用 guide = guide_axis (n.dodge = 2)

library(dplyr)
library(tibble)
library(ggplot2)

dt <- mtcars %>% rownames_to_column("name") %>% 
  dplyr::filter(cyl == 4)

# Overlapping labels
ggplot(dt, aes(x = name, y = mpg)) + geom_point()

enter image description here

ggplot(dt, aes(x = name, y = mpg)) + geom_point() +
  scale_x_discrete(guide = guide_axis(n.dodge = 2))

enter image description here


4
使用“fill”属性可以帮助解决这种情况。您可以使用element_blank()从轴中删除文本,并显示具有图例的多色条形图。我正在绘制维修店中零件拆卸频率,如下所示。
ggplot(data=df_subset,aes(x=Part,y=Removal_Frequency,fill=Part))+geom_bar(stat="identity")+theme(axis.text.x  = element_blank())

在我的情况下,我选择了这个解决方案,因为我的柱状图中有很多条形,并且我无法找到一个合适的字体大小,既可以阅读,又小得足够避免重叠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接