首页 > 解决方案 > R 中的圆形堆叠条形图 - 美学长度必须为 1 或与数据相同 (26)

问题描述

我正在尝试创建一个圆形堆叠条形图,如此处所述(https://www.r-graph-gallery.com/299-circular-stacked-barplot.html)。当我进入制作情节的步骤时出现以下错误(下面以粗体显示):

错误:美学长度必须为 1 或与数据相同 (26):只需运行rlang::last_error()即可查看错误发生的位置。另外:警告消息:删除了包含缺失值的 208 行 (position_stack)。

这是我的数据的样子(有 5 列和 70 行):

个人; 团体; 值1;值2;值3;价值4

这是我的代码:

以整齐的格式(长格式)转换数据

data <- data %>% gather(key = "observation", value="value", -c(1,2)) 

制作情节

p <- ggplot(data) +

  geom_bar(aes(x=as.factor(id), y=value, fill=observation), stat="identity", alpha=0.5) +
  scale_fill_viridis(discrete=TRUE) + 

  geom_segment(data=grid_data, aes(x = end, y = 0, xend = start, yend = 0), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  geom_segment(data=grid_data, aes(x = end, y = 2, xend = start, yend = 2), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  geom_segment(data=grid_data, aes(x = end, y = 4, xend = start, yend = 4), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  geom_segment(data=grid_data, aes(x = end, y = 6, xend = start, yend = 6), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +
  geom_segment(data=grid_data, aes(x = end, y = 8, xend = start, yend = 8), colour = "grey", alpha=1, size=0.3 , inherit.aes = FALSE ) +

  ggplot2::annotate("text", x = rep(max(data$id),5), y = c(0, 2, 4, 6, 8), label = c("0", "2", "4", "6", "8") , color="grey", size=6 , angle=0, fontface="bold", hjust=1) +

  ylim(-150,max(label_data$tot, na.rm=T)) +
  theme_minimal() +
  theme(
    legend.position = "none",
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.margin = unit(rep(-1,4), "cm") 
  ) +
  coord_polar() +  

 geom_text(data=label_data, aes(x=id, y=tot+10, label=individual, hjust=hjust), color="black", fontface="bold",alpha=0.6, size=5, angle= label_data$angle, inherit.aes = FALSE ) +

 geom_segment(data=base_data, aes(x = start, y = -5, xend = end, yend = -5), colour = "black", alpha=0.8, size=0.6 , inherit.aes = FALSE )  +

  geom_text(data=base_data, aes(x = title, y = -18, label=group), hjust=c(1,1,0,0), colour = "black", alpha=0.8, size=4, fontface="bold", inherit.aes = FALSE) 

 **ggsave(p, file="output1.png", width=10, height=10)**

我将不胜感激。

谢谢!!

个人组 价值1 价值2 价值3 价值4

Biomarker1 Group1 0 1 2 2 Biomarker2 Group2 0 1 0 2 Biomarker3 Group2 0 1 0 1 Biomarker4 Group3 1 2 1 0 Biomarker5 Group4 0 2 4 1 Biomarker6 Group4 0 1 0 1 Biomarker7 Group4 0 1 0 1 Biomarker8 Group5 0 1 0 1 Biomarker9 Group6 0 1 1 1 Biomarker10 Group6 0 2 1 1

标签: rbar-chartpolar-coordinates

解决方案


这里有很多问题。前两个是严肃的并且关注“hard_coding”的使用。也就是说,代码不依赖于数据。后两个是您的数据的小问题,而不是代码。

  1. hjust论据:geom_text(data=base_data, aes(...), hjust=c(1,1,0,0), ...
  2. y 轴范围:ylim(-150, max(label_data$tot, na.rm=T))
  3. 数据高度倾斜。
  4. 你有太多的酒吧和太多的团体。

数字 1 导致错误:

# Error: Aesthetics must be either length 1 or the same as the data (24): hjust
# Run `rlang::last_error()` to see where the error occurred.

在链接的帖子中,base_data看起来像这样:

# A tibble: 4 x 4
  group start   end title
  <chr> <int> <dbl> <dbl>
1 A         1     8   4.5
2 B        11    38  24.5
3 C        41    52  46.5
4 D        55    58  56.5

但是对于您的数据,它看起来像这样:

# A tibble: 24 x 4
   group   start   end title
   <chr>   <int> <dbl> <dbl>
 1 Group1      1    -1   0  
 2 Group10     2     1   1.5
 3 Group11     4     5   4.5
 4 Group12     8     8   8  
 5 Group13    11     9  10  
 6 Group14    12    42  27  
 7 Group15    45    43  44  
 8 Group16    46    47  46.5
 9 Group17    50    49  49.5
10 Group18    52    52  52  
# ... with 14 more rows

因此,hjust需要将参数更改为取决于数据的内容,而不是使用值进行硬编码。也许只是省略它并查看图表的外观并在需要时更改它。

2 号并不严重,但会导致您的图表在中心有一个大洞。-150 的值是基于数据的,所以这(硬编码)是不好的做法。看起来最小 y 轴值应该更改为-max(label_data$tot, na.rm=T),现在更通用了。但这可能需要一些修补才能获得最佳结果。理想值还可能取决于条形的数量和数据的偏度。

还有其他部分也使用了硬编码。

3 号并不严重,但会导致一些标签出现在绘图区域之外。您可以尝试转换 y 轴,但我将由您决定。

4号也不严重,但会导致内圈内的标签重叠。

修复这些和其他小问题后,您应该得到以下信息:


在此处输入图像描述


推荐阅读