用 geom_bar() 叠加两个条形图
Overlay two bar plots with geom_bar()
我正在尝试将两个条形图叠加在一起,而不是并排放置。
数据来自同一个数据集。我想要 'Block' 在 x 轴上,'Start' 和 'End' 作为叠加条形图。
Block Start End
1 P1L 76.80 0.0
2 P1S 68.87 4.4
3 P2L 74.00 0.0
4 P2S 74.28 3.9
5 P3L 82.22 7.7
6 P3S 80.82 17.9
我的脚本是
ggplot(data=NULL,aes(x=Block))+
geom_bar(data=my_data$Start,stat="identity",position ="identity",alpha=.3,fill='lightblue',color='lightblue4')+
geom_bar(data=my_data$End,stat="identity",position ="identity",alpha=.8,fill='pink',color='red')
我收到错误:ggplot2 不知道如何处理 class 数字
的数据
我也试过了
ggplot(my_data,aes(x=Block,y=Start))+
geom_bar(data=my_data$End, stat="identity",position="identity",...)
有人知道我怎样才能实现吗?谢谢。
编辑:
如何获得闪避叠加条?
我编辑这个 post,因为我的下一个问题是相关的,因为它与我原来的问题 post 相反。
@P.merkle
我不得不将我的绘图更改为四个条形图,显示所有标记为 L 和 S 的块的平均值。L 代表沿岸,S 代表沿岸。他们接受了两种治疗:正常和减少。
我计算了均值及其标准差。
我需要四个带有各自错误栏的栏:
Normal/Littoral , Reduced/Littoral , Normal/Sublittoral , Reduced/Sublittoral.
问题是当我绘制它时,沿岸条和沿岸条相互重叠!所以现在我希望它们 而不是 重叠!
我怎样才能让它发生?我已经尝试了各种 position = 'dodge'
和 position = position_dodge(newdata$Force)
,没有运气......
我的 newdata
包含以下信息:
Zonation Force N mean sd se
1 Litoral Normal 6 0.000000 0.000000 0.000000
2 Litoral Redusert 6 5.873333 3.562868 1.454535
3 Sublitoral Normal 6 7.280000 2.898903 1.183472
4 Sublitoral Redusert 6 21.461667 4.153535 1.695674
我的脚本是这样的:
ggplot(data=cdata,aes(x=newdata$Force,y=newdata$mean))+
geom_bar(stat="identity",position ="dodge",
alpha=.4,fill='red', color='lightblue4',width = .6)+
geom_errorbar(aes(ymin=newdata$mean-sd,ymax=newdata$mean+sd),
width=.2, position=position_dodge(.9))
结局很不幸this
从误差线来看,显然有四个误差线,但它们重叠了。请问,我该如何解决?
如果您不需要图例,解决方案 1 可能适合您。它更简单,因为它以宽格式保存您的数据。
如果您需要图例,请考虑解决方案 2。它需要将您的数据从宽格式转换为长格式。
解决方案 1:无图例(保留宽格式)
您可以在单个 geom 的级别上完善您的美学规范(此处,geom_bar
):
ggplot(data=my_data, aes(x=Block)) +
geom_bar(aes(y=Start), stat="identity", position ="identity", alpha=.3, fill='lightblue', color='lightblue4') +
geom_bar(aes(y=End), stat="identity", position="identity", alpha=.8, fill='pink', color='red')
解决方案 2:添加图例(转换为长格式)
要添加图例,请先使用 reshape2::melt
将您的数据框从宽格式转换为长格式。
这给你两列,
variable
列(“开始”与“结束”),
- 和
value
列
现在使用 variable
列来定义图例:
library(reshape2)
my_data_long <- melt(my_data, id.vars = c("Block"))
ggplot(data=my_data_long, aes(x=Block, y=value, fill=variable, color=variable, alpha=variable)) +
geom_bar(stat="identity", position ="identity") +
scale_colour_manual(values=c("lightblue4", "red")) +
scale_fill_manual(values=c("lightblue", "pink")) +
scale_alpha_manual(values=c(.3, .8))
我正在尝试将两个条形图叠加在一起,而不是并排放置。 数据来自同一个数据集。我想要 'Block' 在 x 轴上,'Start' 和 'End' 作为叠加条形图。
Block Start End
1 P1L 76.80 0.0
2 P1S 68.87 4.4
3 P2L 74.00 0.0
4 P2S 74.28 3.9
5 P3L 82.22 7.7
6 P3S 80.82 17.9
我的脚本是
ggplot(data=NULL,aes(x=Block))+
geom_bar(data=my_data$Start,stat="identity",position ="identity",alpha=.3,fill='lightblue',color='lightblue4')+
geom_bar(data=my_data$End,stat="identity",position ="identity",alpha=.8,fill='pink',color='red')
我收到错误:ggplot2 不知道如何处理 class 数字
的数据我也试过了
ggplot(my_data,aes(x=Block,y=Start))+
geom_bar(data=my_data$End, stat="identity",position="identity",...)
有人知道我怎样才能实现吗?谢谢。
编辑:
如何获得闪避叠加条?
我编辑这个 post,因为我的下一个问题是相关的,因为它与我原来的问题 post 相反。
@P.merkle
我不得不将我的绘图更改为四个条形图,显示所有标记为 L 和 S 的块的平均值。L 代表沿岸,S 代表沿岸。他们接受了两种治疗:正常和减少。
我计算了均值及其标准差。 我需要四个带有各自错误栏的栏: Normal/Littoral , Reduced/Littoral , Normal/Sublittoral , Reduced/Sublittoral.
问题是当我绘制它时,沿岸条和沿岸条相互重叠!所以现在我希望它们 而不是 重叠!
我怎样才能让它发生?我已经尝试了各种 position = 'dodge'
和 position = position_dodge(newdata$Force)
,没有运气......
我的 newdata
包含以下信息:
Zonation Force N mean sd se
1 Litoral Normal 6 0.000000 0.000000 0.000000
2 Litoral Redusert 6 5.873333 3.562868 1.454535
3 Sublitoral Normal 6 7.280000 2.898903 1.183472
4 Sublitoral Redusert 6 21.461667 4.153535 1.695674
我的脚本是这样的:
ggplot(data=cdata,aes(x=newdata$Force,y=newdata$mean))+
geom_bar(stat="identity",position ="dodge",
alpha=.4,fill='red', color='lightblue4',width = .6)+
geom_errorbar(aes(ymin=newdata$mean-sd,ymax=newdata$mean+sd),
width=.2, position=position_dodge(.9))
结局很不幸this
从误差线来看,显然有四个误差线,但它们重叠了。请问,我该如何解决?
如果您不需要图例,解决方案 1 可能适合您。它更简单,因为它以宽格式保存您的数据。
如果您需要图例,请考虑解决方案 2。它需要将您的数据从宽格式转换为长格式。
解决方案 1:无图例(保留宽格式)
您可以在单个 geom 的级别上完善您的美学规范(此处,geom_bar
):
ggplot(data=my_data, aes(x=Block)) +
geom_bar(aes(y=Start), stat="identity", position ="identity", alpha=.3, fill='lightblue', color='lightblue4') +
geom_bar(aes(y=End), stat="identity", position="identity", alpha=.8, fill='pink', color='red')
解决方案 2:添加图例(转换为长格式)
要添加图例,请先使用 reshape2::melt
将您的数据框从宽格式转换为长格式。
这给你两列,
variable
列(“开始”与“结束”),- 和
value
列
现在使用 variable
列来定义图例:
library(reshape2)
my_data_long <- melt(my_data, id.vars = c("Block"))
ggplot(data=my_data_long, aes(x=Block, y=value, fill=variable, color=variable, alpha=variable)) +
geom_bar(stat="identity", position ="identity") +
scale_colour_manual(values=c("lightblue4", "red")) +
scale_fill_manual(values=c("lightblue", "pink")) +
scale_alpha_manual(values=c(.3, .8))