首页 > 解决方案 > 如何根据R中tibble的大小制作动态图形大小?

问题描述

我在列表中有不同大小的小标题(列相同,行不同)。

这是小标题的示例:

parts1 <- c("KNA00197J-AN", "KNA00007J-PF", "KNA00007J-PF", "KNA00009J-PF", "KNA00022JB-AN",    "KNA00009J-PF", "KSB00026J-PQ", "KSB00027J-PQ", "KSB00029J-PQ", "KSB00023J-PQ", "KSB00065J-PQ", "KSB00187J-PQ", "KSB00031JB-PQ",    "KSB00060J-AN", "KSD00042J",    "KSD00030J",    "KSD00033J",    "KSD00040J",    "KSD00043J",    "KNA00029J",    "KNA00035J",    "KSD00036J",    "KND00003J",    "KSD00053J",    "KSD00029J",    "KSD00032J",    "KSA00030J",    "KSD00074J",    "KSD00078J",    "KSE00031J",    "KSE00032J")
value1 <- c(300,100,200,200,200,200,562,336,623,415,182,145,640,563,286,264,264,312,286,72,60,286,8,360,264,264,154,1440,1024,52,32)

parts2 <- c("KNA00197J-AN", "KNA00007J-PF", "KNA00007J-PF", "KNA00009J-PF", "KNA00022JB-AN")
value2 <- c(300,100,200,200,200)

df1 <- data.frame(parts = parts1, value = value1)
df2 <- data.frame(parts = parts2, value = value2)

list_df <- list(df1,df2)

现在,我使用 ggplot 为列表中的这些小标题制作条形图并编织为 pdf。

for(n in 1:length(list_df)){
  pic<- ggplot(list_df[[n]], aes(x = value, y =parts ))+
    geom_col(position = "dodge", width=0.5)
  
  print(pic)
}

图表大小相同。我们可以让它根据 tibble 的零件编号自动更改大小以使其易于阅读吗?

比如,使 df1 图在 y 轴上传播得更长。

十分感谢!

标签: rggplot2r-markdown

解决方案


我假设您希望每个图都在一个单独的 pdf 文件中,然后您可以执行类似的操作,其中我使用函数的height参数来ggsave根据行数调整图的高度。

默认情况下,高度以英寸为单位,因此为了不增加每行一整英寸,我将高度缩放了 3 倍,以便每行将增加 1/3 英寸的绘图。

library(tidyverse)

parts1 <- c("KNA00197J-AN", "KNA00007J-PF", "KNA00007J-PF", "KNA00009J-PF", "KNA00022JB-AN",    "KNA00009J-PF", "KSB00026J-PQ", "KSB00027J-PQ", "KSB00029J-PQ", "KSB00023J-PQ", "KSB00065J-PQ", "KSB00187J-PQ", "KSB00031JB-PQ",    "KSB00060J-AN", "KSD00042J",    "KSD00030J",    "KSD00033J",    "KSD00040J",    "KSD00043J",    "KNA00029J",    "KNA00035J",    "KSD00036J",    "KND00003J",    "KSD00053J",    "KSD00029J",    "KSD00032J",    "KSA00030J",    "KSD00074J",    "KSD00078J",    "KSE00031J",    "KSE00032J")
value1 <- c(300,100,200,200,200,200,562,336,623,415,182,145,640,563,286,264,264,312,286,72,60,286,8,360,264,264,154,1440,1024,52,32)

parts2 <- c("KNA00197J-AN", "KNA00007J-PF", "KNA00007J-PF", "KNA00009J-PF", "KNA00022JB-AN")
value2 <- c(300,100,200,200,200)

df1 <- data.frame(parts = parts1, value = value1)
df2 <- data.frame(parts = parts2, value = value2)

list_df <- list(df1,df2)

scale_factor <- 3
for(n in 1:length(list_df)){
  print(n)
  ggplot(list_df[[n]], aes(x = value, y =parts )) +
    geom_col(position = "dodge", width=0.5)
  
  ggsave(paste0('plot_',n,'.pdf'), height=nrow(list_df[[n]])/scale_factor, width=6)
}

推荐阅读