在 ggplot 中创建垂直坐标轴标签而不是旋转

3
我正在尝试创建一条线图,其中x轴实际上是一个因子。我希望刻度标签是单词,并且我希望它们以垂直而不是水平方式显示。
经过搜索,我已经能够创建一个绘图,在这个绘图中,轴标签被旋转了90度,但这并不是我想要的。
下面提供了一个玩具示例:
library(ggplot2)
df <- data.frame(x = 1:5, y = sample(1:10, 5, TRUE))

ggplot(aes(x, y), data = df) + geom_line() + 
scale_x_continuous(breaks = 1:5, labels = c('foo', 'bar', 'baz', 'phi', 'fum')) + 
theme(axis.text.x = element_text(angle = 90, vjust = 0.5))

我希望标签(如'foo')不再以90度角的方式呈现,而是以

f    
o    
o

等等。

非常感谢您能给我任何建议。我知道可以使用R的plot()函数来完成此操作,但出于与我的实际数据有关的原因,我决定使用ggplot


提交后,最后一个“foo”的外观发生了变化。请理解为垂直的“foo”,即“f”在“o”的上方,“o”在另一个“o”的上方。 - edienes
现在它回到了最初的意图。抱歉,这是我第一次发布。我想我应该再等几秒钟 :-) - edienes
1
我认为您无法旋转单个字母(如果有展示,我很高兴)。但是您可以使用换行符(\n)分隔符来定义标签,例如 f\no\no - user20650
2个回答

2

将评论升级为答案。

一种解决方法是使用换行符定义标签。 \n 强制下一个字符移到新的一行。

您的示例:

library(ggplot2)

df <- data.frame(x = 1:5, y = sample(1:10, 5, TRUE))

ggplot(aes(x, y), data = df) + 
           geom_line() + 
           scale_x_continuous(breaks = 1:5, 
              labels = gsub("", "\n", c('foo', 'bar', 'baz', 'phi', 'fum'))) + 
           theme(axis.text.x = element_text(size=20))


编辑

根据Baptiste的评论,定义标签的更简洁方法是:

labels = sapply(strsplit(c('foo', 'bar', 'baz', 'phi', 'fum'),""), 
                                                    paste, collapse="\n")

这个没有开头和结尾的分隔符。


gsub 行在每个字母之间插入了一个 \n

gsub("", "\n", c('foo', 'bar', 'baz', 'phi', 'fum')) 
# [1] "\nf\no\no\n" "\nb\na\nr\n" "\nb\na\nz\n" "\np\nh\ni\n" "\nf\nu\nm\n"

这将会产生:

在此输入图片描述

我不希望在每个单词前后插入分隔符,但我不知道正则表达式 - 请随意更新。


1
sapply(strsplit(labs,""), paste, collapse="\n") 是一种选择。 - baptiste
非常感谢你们两位!我之前已经实现了这个功能,看起来很不错。 - edienes

1

虽然不是针对您具体的示例,但更普遍的情况是标签是自动生成的(离散比例尺)。

library(ggplot2)
df <- data.frame(x = c('foo', 'bar', 'baz', 'phi', 'fum'), 
                 y = sample(1:10, 5, TRUE))

label_v <- function(lab){
  lab <- as.character(lab)
  sapply(strsplit(lab,""), paste, collapse="\n")
}

ggplot(aes(x, y,group=1), data = df) + geom_line() + 
  scale_x_discrete(labels=label_v) 

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