使用ggplot在多个图中使用相同宽度的y标签

时间:2018-04-20 06:57:20

标签: r ggplot2 label width

我想在不同页面上使用ggplot生成x绘图的输出。 y标签是具有不同长度的文本变量。 取决于最大值这些标签的长度看起来不一样,标签和图表区域由ggplot自动优化。 应该有办法让y标签的宽度始终相同吗? page 1

page 2

ggplot命令的代码片段:

print(ggplot(dfPriceArt[ixStart:ixEnde, ], aes(x=reorder(BATArtikelKomplett, MaxEinzelpreisPerc), y=MaxEinzelpreisPerc, size=MaxEinzelpreisPerc)) + 
geom_point() +
coord_flip() +
labs(y='BATArtikel',x='MaxEinzelpreis') +
theme(axis.text=element_text(size=6)) +
scale_y_continuous(limits=c(100, maxEinzelpreisPerc)) +
scale_size_continuous(limits=c(100, maxEinzelpreisPerc)))

3 个答案:

答案 0 :(得分:2)

你可以尝试

library(tidyverse)
library(grid)
library(gridExtra)
# some data and plots
df <-  iris %>% 
  bind_rows(iris %>% mutate(Species=paste0(Species,"_", Species)), .id = "gr") %>% 
  group_by(gr,Species) %>% 
  summarise(y=mean(Sepal.Length)) %>% 
  nest(-gr) %>%   
  mutate(plots= map(data, ~ggplot(data=.x, aes(Species, y)) +
               geom_point() +
               coord_flip()))

df$plots
[[1]]

[[2]]

enter image description here enter image description here

# updating the width
gp1<- ggplot_gtable(ggplot_build(df$plots[[1]]))
gp2<- ggplot_gtable(ggplot_build( df$plots[[2]]))
maxWidth = unit.pmax(gp1$widths[2:3], gp2$widths[2:3])

gp1$widths[2:3] <- maxWidth
gp2$widths[2:3] <- maxWidth
grid.arrange(gp1)

enter image description here ^

grid.arrange(gp2)

enter image description here

最后,您可以使用

保存图表
ggsave("test1.jpeg",grid.arrange(gp1))
ggsave("test2.jpeg",grid.arrange(gp2))

这个想法是

答案 1 :(得分:0)

我没有直接的方法,但您可以填充y标签并使用固定宽度的字体来对齐图表。由于您没有提供任何样本数据,因此这是一个简短的示例:

library(tidyverse)
library(gridExtra)

# create two data.frames with differing lengths for the labels
df1 <- tribble(~x, ~y,
               1, paste0(letters[1:10], collapse = ""))

df2 <- tribble(~x, ~y,
               1, paste0(letters[1:20], collapse = ""))

# find the length of the longest label
max_length <- max(str_length(df2$y))

# pad the shorter labels
df1 <- mutate(df1, y = str_pad(y, max_length, side = "left"))


# create plots using a fixed width font
p1 <- ggplot(df1, aes(x, y)) +
  geom_point()+
  theme(axis.text.y = element_text(family = "mono"))

p2 <- ggplot(df2, aes(x, y)) +
  geom_point()+
  theme(axis.text.y = element_text(family = "mono"))

# arrange them for demonstrative purposes
grid.arrange(p1, p2)

reprex package(v0.2.0)创建于2018-04-20。

答案 2 :(得分:0)

left align two graph edges (ggplot)的第一条评论有助于在Align multiple plots in ggplot2 when some have legends and others don't之后找到自己的解决方案(上次修改)。

@Jimbou指出我想每页有一个情节,很抱歉没有提到。

这就是我现在的解决方案:

library(gridExtra)
...
for (i in 1:iLast) {
    ...
    p <- ggplot(dfPriceArt[ixStart:ixEnde, ], aes(x=reorder(BATArtikelKomplett, MaxEinzelpreisPerc), y=MaxEinzelpreisPerc, size=MaxEinzelpreisPerc)) + 
        geom_point() +
        coord_flip() +
        labs(y='BATArtikel',x='MaxEinzelpreis') +
        theme(axis.text=element_text(size=6)) +
        scale_y_continuous(limits=c(100, maxEinzelpreisPerc)) +
        scale_size_continuous(limits=c(100, maxEinzelpreisPerc))
    plot_list[[i]] <- ggplotGrob(p)
    widths_list[[i]] <- plot_list[[i]]$widths[2:5]
    ...
}
maxWidth <- do.call(grid::unit.pmax, widths_list)
for (i in 1:iLast) {
  plot_list[[i]]$widths[2:5] <- as.list(maxWidth)
  grid.draw(plot_list[[i]])
  if (i != iLast) {
    grid.newpage()
  }
}