使用两行

时间:2016-12-01 14:18:44

标签: r plot ggplot2 axis-labels

我对我生成的以下情节有疑问。使用ggplot2命令生成两个具有相同y轴的条形图。我的问题是,我想为每个标签在两行中写出y​​轴的标签。而且标签不是数字也不是日期,它们是字符(我认为它们就像这样称呼)。

首先,这是原始数据集:

VS <- data.frame(X = c("sehr viel Spaß/Sehr gut", "Viel Spaß/Gut", "Normal/Neutral","wenig Spaß/schlecht",  
                       "sehr wenig Spaß/Sehr schlecht"), 
                 Spaß = c(4,8,10,3,3), Beurteilung = c(5,6,9,4,4), stringsAsFactors = F)

为了生成绘图,我创建了以下命令:

VS$X <- factor(VS$X, c("sehr wenig Spaß/Sehr schlecht", "wenig Spaß/schlecht", "Normal/Neutral", "Viel Spaß/Gut", "sehr viel Spaß/Sehr gut"))


library(ggplot2)
library(grid)

g.mid<-ggplot(VS,aes(x=1,y=X))+geom_text(aes(label=X))+
  geom_segment(aes(x=0.94,xend=0.96,yend=X))+
  geom_segment(aes(x=1.04,xend=1.065,yend=X))+
  ggtitle("")+
  ylab(NULL)+
  scale_x_continuous(expand=c(0,0),limits=c(0.94,1.065))+
  theme(axis.title=element_blank(),
        panel.grid=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        panel.background=element_blank(),
        axis.text.x=element_text(color=NA),
        axis.ticks.x=element_line(color=NA),
        plot.margin = unit(c(1,-1,1,-1), "mm"))

g1 <- ggplot(data = VS, aes(x = X, y = Spaß)) +
  geom_bar(stat = "identity", fill="#33FF00", colour="green") + ggtitle("Häufigkeit bei Spaß an Videoserstellung") + 
theme(axis.title.x = element_blank(), 
        axis.title.y = element_blank(), 
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        plot.margin = unit(c(1,-1,1,0), "mm")) +
  scale_y_reverse() + coord_flip()

g2 <- ggplot(data = VS, aes(x = X, y = Beurteilung)) +xlab(NULL)+
  geom_bar(stat = "identity", fill="#3333FF", colour="blue") + ggtitle("Häufigkeit bei Beurteilung der Software") +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), 
        axis.text.y = element_blank(), axis.ticks.y = element_blank(),
        plot.margin = unit(c(1,0,1,-1), "mm")) +
  coord_flip()


library(gridExtra)
gg1 <- ggplot_gtable(ggplot_build(g1))
gg2 <- ggplot_gtable(ggplot_build(g2))
gg.mid <- ggplot_gtable(ggplot_build(g.mid))

grid.arrange(gg1,gg.mid,gg2, ncol=3, widths=c(4/9,1/9,4/9),top=textGrob("VideoScribe Analyse", gp=gpar(fontsize=19,font=8))) 

生成的图如下所示: enter image description here

就像你可能看到的那样,y轴的标签被图表切割了......无论如何它们有点长。但对于我的考试,我无法缩短它们。所以我尝试使用命令\n将每个标签写成两行,但它不起作用。具体来说:我想用“SehrvielSpaß/ Sehr gut”来制作“SehrvielSpaß”并直接写在“Sehr gut”下面。任何人都可以给我一个提示或帮助我,我怎么能这样做?

我还尝试了一些其他的东西,比如gsub,但是有问题,我在标签内部没有一致性或重复部分。有人可以帮忙吗?

PS:为了让y轴按此顺序排列,我创建了一个静态命令 - 就像你可能已经看过的那样。我也尝试了以下命令:VS$X <- factor(VS$X, as.character(VS$X)),但是这样我得到错误顺序的y轴。它应该转过来,“SehrvielSpaß/ Sehr gut”位于顶部。有人可能也有这个想法吗?

1 个答案:

答案 0 :(得分:0)

/替换为\n对我有用。我怀疑你在更换和以下因素水平重新安排方面做错了。

VS <- data.frame(X = c("sehr viel Spaß/Sehr gut", "Viel Spaß/Gut",
                       "Normal/Neutral","wenig Spaß/schlecht",  
                       "sehr wenig Spaß/Sehr schlecht"), 
                 Spaß = c(4,8,10,3,3), Beurteilung = c(5,6,9,4,4),
                 stringsAsFactors=FALSE)
VS$X <- gsub("/", "\n", VS$X)
VS$X <- factor(VS$X, c("sehr wenig Spaß\nSehr schlecht",
                       "wenig Spaß\nschlecht",
                       "Normal\nNeutral",
                       "Viel Spaß\nGut",
                       "sehr viel Spaß\nSehr gut"))

library(ggplot2)
library(grid)

g.mid<-ggplot(VS,aes(x=1,y=X))+geom_text(aes(label=X))+
  geom_segment(aes(x=0.94,xend=0.96,yend=X))+
  geom_segment(aes(x=1.04,xend=1.065,yend=X))+
  ggtitle("")+
  ylab(NULL)+
  scale_x_continuous(expand=c(0,0),limits=c(0.94,1.065))+
  theme(axis.title=element_blank(),
        panel.grid=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        panel.background=element_blank(),
        axis.text.x=element_text(color=NA),
        axis.ticks.x=element_line(color=NA),
        plot.margin = unit(c(1,-1,1,-1), "mm"))

g1 <- ggplot(data = VS, aes(x = X, y = Spaß)) +
  geom_bar(stat = "identity", fill="#33FF00", colour="green") + ggtitle("Häufigkeit bei Spaß an Videoserstellung") + 
theme(axis.title.x = element_blank(), 
        axis.title.y = element_blank(), 
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        plot.margin = unit(c(1,-1,1,0), "mm")) +
  scale_y_reverse() + coord_flip()

g2 <- ggplot(data = VS, aes(x = X, y = Beurteilung)) +xlab(NULL)+
  geom_bar(stat = "identity", fill="#3333FF", colour="blue") + ggtitle("Häufigkeit bei Beurteilung der Software") +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), 
        axis.text.y = element_blank(), axis.ticks.y = element_blank(),
        plot.margin = unit(c(1,0,1,-1), "mm")) +
  coord_flip()


library(gridExtra)
gg1 <- ggplot_gtable(ggplot_build(g1))
gg2 <- ggplot_gtable(ggplot_build(g2))
gg.mid <- ggplot_gtable(ggplot_build(g.mid))

grid.arrange(gg1,gg.mid,gg2, ncol=3,
             widths=c(4/9,1/9,4/9),top=textGrob("VideoScribe Analyse",

enter image description here