如何解决如何在ggboxplot中添加自定义图例
我正在尝试在R中创建一些箱形图。我一直在使用ggboxplot和ggplot。到目前为止,这是我的代码和输出:
ggboxplot:
ggboxplot(shp_PA@data,x = "hei_1998to2007_cat",y = "adjrate.2008to2017",xlab = "Hazardous Exposure Index Jenks",ylab = "Lung Cancer Incidence Rate",color = "red",add = c("jitter","mean"),add.params = list(color = "black",shape=20))
ggplot:
shp_PA@data %>%
ggplot(aes(x=hei_1998to2007_cat,y=adjrate.2008to2017)) +
geom_boxplot(colour = "red") +
geom_jitter(color="black",size=0.75) +
stat_summary(fun=mean,geom="point",shape=4,size=3,color="black") +
xlab("Hazardous Exposure Index Jenks") +
ylab("Lung Cancer Incidence Rate")
我现在的主要兴趣是在每个箱形图上放置一个图例,该图例上带有用于表示均值的符号,并在其旁边添加单词“ Mean”。在base R中,就像放一个类似的东西一样简单
legend("topright",legend=c("Mean"),pch=5,col="red")
但是我无法在ggboxplot或ggplot中弄清楚。我在网上看到的大多数内容都在讨论如何修改已经存在的图例。
我想知道的另一件事是特定于ggboxplot。我希望能够使抖动点的颜色和形状与均值符号不同。我尝试将add.params代码更改为
add.params = list(color = c("black","blue"),shape=c(20,4))
但是我得到了错误
Error: Aesthetics must be either length 1 or the same as the data (213): shape and colour
非常感谢您的帮助!
编辑:使用R中的虹膜数据集添加可重现的示例
ggboxplot:
ggboxplot(iris,x = "Species",y = "Sepal.Length",shape=20))
ggplot:
ggplot(data=iris,aes(x=Species,y=Sepal.Length)) +
geom_boxplot(colour = "red") +
geom_jitter(color="black",color="black")
再次,我想添加一个图例,并使用用于描述均值和“ Mean”一词的符号,并能够使用ggboxplot使抖动的颜色和形状以及均值有所不同。 / p>
解决方法
使用ggplot
有点不规范,但是您可以执行以下操作。
添加带有用于表示均值和符号“ Mean”的符号的图例
使用geom_jitter
将不同的形状映射到stat_summary
和aes
。使用scale_shape_manual
具有抖动的颜色和形状,并且表示不同
使用color
更改抖动点和均值点的颜色,并使用override.aes
更改图例中的颜色。
ggplot(data=iris,aes(x=Species,y=Sepal.Length)) +
geom_boxplot(colour = "red") +
geom_jitter(size=1,color = 'green',aes(shape = 'all data')) +
stat_summary(fun=mean,geom="point",size=3,color = 'black',aes(shape = 'mean')) +
scale_shape_manual(values = c(20,4)) +
guides(shape = guide_legend(override.aes = list(color = c('green','black'))))
此处还有另一个类似的答案:https://stackoverflow.com/a/5179731/12400385
,欢迎您!
向ggplot2
添加自定义标签非常困难,我相信这是设计使然。所有图例均由aes
和scale_*_[continuoues|discrete|manual]
中的参数控制。如果我们不想开始学习如何grob
(可能要花费几个小时),则可以通过以下方式获得所需的输出
- 添加数据本身的统计信息
- 创建一列,指示哪个是统计数据,哪个是数据点
- 禁止我们直接在
geom_*
函数中subset the data为jitter
和非jitter
点创建特定的图层,并在美学中设置形状这些层中的 - 使用
scale_shape_manual
(或scale_shape_discrete
)自定义标记。
以mtcars
数据集为例(并使用dplyr
进行管道传输),我们可以获得与ggboxplot
类似的内容
library(ggplot2)
library(dplyr)
data(mtcars)
# Setup data with mean instead of using stat_summary
mtcars %>%
select(cyl,hp) %>%
group_by(cyl) %>%
summarize(hp = mean(hp)) %>%
bind_cols(stat = factor(rep('mean',3))) %>%
bind_rows(mtcars %>%
select(cyl,hp) %>%
bind_cols(stat = rep('data',nrow(mtcars)))) %>%
# Create ggplot
ggplot(aes(x = factor(cyl),y = hp)) +
geom_boxplot(colour = 'red') +
# Jitter based on subset of data. Do the same for geom_point (means)
## Note that to only plot a subset I pass a function to data that "filters" the data.
geom_jitter(data = function(.data)filter(.data,stat == 'data'),aes(shape = stat),color = 'black') +
# Add mean to the point and change shape into something we like.
geom_point(data = function(.data)filter(.data,stat == 'mean'),size = 2.5) +
## Use scale_shape_manual to change shape into something i like.
scale_shape_manual(values = c('mean' = 8,'data' = 16)) +
# Fix the plot theme to be similar to ggboxplot
theme(panel.grid = element_line(colour = NA),panel.background = element_rect(fill = "#00000000"),axis.line.x = element_line(colour = 'black'),axis.line.y = element_line(colour = 'black'),axis.text = element_text(size = 11),legend.position = 'bottom'
) +
# Remove label from the legend if wanted
labs(shape = NULL)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。