微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

添加多 x 轴 ggplot2 或自定义标签到堆栈条形图

如何解决添加多 x 轴 ggplot2 或自定义标签到堆栈条形图

嘿,

我正在尝试在 x 轴上集成 (1) 或 (2) 在图形的堆栈条(或类似的东西)顶部添加深度范围的信息。请看下面的图片

enter image description here

带有标签enter image description here

(1) 不知道该怎么做。

(2) 要在堆叠条形图顶部绘制信息,我首先创建了变量:

depth_int <- c("5-200 m","5-181 m","5-200 m","5-155 m","5-90 m","10-60 m","10-90 m","10-30 m","20-90 m","0.5-30 m","0.5-90 m","0.5-90 m")

并在我的 ggplot() 上使用这个函数 geom_text(aes(label = depth_int),hjust = 0,position = "stack")

我收到此错误 Error: Aesthetics must be either length 1 or the same as the data (164): label

(我猜是因为堆叠的条形图是分类群的组合,然后您不能在每个站点(例如 P1)的条形图顶部仅绘制 1 个值。

-

这是我的脚本:

ggplot(df,aes(x=locationID,fill=class,y = V1))+
  geom_bar(stat="identity",position = "stack",width = 0.9)+
  facet_grid(. ~ expedition,scales="free_x") +
  #scale_fill_manual(values = default_colors,labels= c("","",""))          #default_colors<-c("#F8766D","#00BA38","#619CFF")
  # change the label names in the legend
  labs(title = "Taxa abundance per depth integrated",fill = "Taxa",x= bquote('Stations'),y= bquote('Abundance'~(cells~m^-3)))+ 
  theme_minimal()+
    theme(panel.grid.major.y = element_line(size = 0.5,linetype = 'solid',colour = "grey75"),panel.grid.minor.y = element_line(size = 0.5,panel.grid.major.x = element_blank(),panel.background = element_rect(fill = "white",axis.text.x = element_text(colour="black",size=7),axis.text.y = element_text(colour="black",size=10),axis.title.x = element_text(colour="black",axis.title.y = element_text(colour="black",plot.title = element_text(colour = "black",size = 10,face = "bold"),legend.position = "right",legend.text = element_text(size=10),legend.title = element_text(size = 11,hjust =0.5,vjust = 3,legend.key.size = unit(10,"point"),legend.spacing.y = unit(-.25,"cm"),legend.margin=margin(0,5,8,5),legend.Box.margin=margin(-10,10,-3,10),legend.Box.spacing = unit(0.5,plot.margin = margin(2,2,0)) 

解决方法

简单地将矢量标签传递给 geom_text 是行不通的。为了达到您想要的结果,您可以

  1. 汇总您的数据以按位置和远征获得条形的总高度

  2. 将您的标签添加到汇总数据框中。为此,我按位置和探险使用了一个标签数据框,并将其加入到汇总的 df 中。

  3. 使用汇总的数据框作为 geom_text

    中的数据

注意:由于汇总的 df 没有列 class,我将 fill=class 作为本地 aes 放在 geom_bar 中。

使用一些随机示例数据试试这个:

library(ggplot2)
library(tidyr)
library(dplyr)

# Random example dataset
set.seed(42)
df <- data.frame(
  locationID = c(sample(LETTERS[1:4],50,replace = TRUE),sample(LETTERS[5:8],replace = TRUE)),class = sample(letters[1:4],100,expedition = rep(paste("expedition",1:2),each = 50),V1 = runif(100)
)

# Make a dataframe of labels by expedition and locationID
depth_int <- tidyr::expand(df,nesting(expedition,locationID))
depth_int$label <- c("5-200 m","5-181 m","5-200 m","5-90 m","10-60 m","10-90 m","10-30 m")
depth_int
#> # A tibble: 8 x 3
#>   expedition   locationID label  
#>   <chr>        <chr>      <chr>  
#> 1 expedition 1 A          5-200 m
#> 2 expedition 1 B          5-181 m
#> 3 expedition 1 C          5-200 m
#> 4 expedition 1 D          5-200 m
#> 5 expedition 2 E          5-90 m 
#> 6 expedition 2 F          10-60 m
#> 7 expedition 2 G          10-90 m
#> 8 expedition 2 H          10-30 m

# Summarise your data to get the height of the stacked bar and join the labels
df_labels <- df %>% 
  group_by(locationID,expedition) %>% 
  summarise(V1 = sum(V1)) %>% 
  left_join(depth_int,by = c("locationID","expedition"))

ggplot(df,aes(x=locationID,y = V1))+
  geom_bar(aes(fill=class),stat="identity",position = "stack",width = 0.9) +
  # Use summarised data to put the labels on top of the stacked bars
  geom_text(data = df_labels,aes(label = label),vjust = 0,nudge_y = 1) +
  facet_grid(. ~ expedition,scales="free_x") +
  labs(title = "Taxa abundance per depth integrated",fill = "Taxa",x= bquote('Stations'),y= bquote('Abundance'~(cells~m^-3)))+ 
  theme_minimal()+
  theme(panel.grid.major.y = element_line(size = 0.5,linetype = 'solid',colour = "grey75"),panel.grid.minor.y = element_line(size = 0.5,panel.grid.major.x = element_blank(),panel.background = element_rect(fill = "white",axis.text.x = element_text(colour="black",size=7),axis.text.y = element_text(colour="black",size=10),axis.title.x = element_text(colour="black",axis.title.y = element_text(colour="black",plot.title = element_text(colour = "black",size = 10,face = "bold"),legend.position = "right",legend.text = element_text(size=10),legend.title = element_text(size = 11,hjust =0.5,vjust = 3,legend.key.size = unit(10,"point"),legend.spacing.y = unit(-.25,"cm"),legend.margin=margin(0,5,8,5),legend.box.margin=margin(-10,10,-3,10),legend.box.spacing = unit(0.5,plot.margin = margin(2,2,0)) 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?