ggplot2 - 如何向 stat_summary 行添加其他行以及如何更改 ggplot2 geom_dotplot 中的形状?
问题描述
我正在制作 ggplot、geom_dotplot 并通过“stat_summary”添加行。请参阅下面的代码和绘图。'stat_summary' 将制作方框来指示均值、均值-sd 和均值+sd。
ToothGrowth$dose <- as.factor(ToothGrowth$dose)
library(ggplot2)
p<-ggplot(ToothGrowth, aes(x=dose, y=len))+
geom_dotplot(binaxis='y', stackdir='center', dotsize=0.5)+theme_classic()
data_summary <- function(x) {
m <- mean(x)
ymin <- m-sd(x)
ymax <- m+sd(x)
return(c(y=m,ymin=ymin,ymax=ymax))
}
p+stat_summary(fun.data=data_summary,geom="crossbar",width=0.5,color="blue")
然后,我喜欢做的最后一个情节是在中间添加一条新的垂直线,并在外面删除旧的垂直线,如下所示。我从上面的情节手动制作了这个情节。
是否有 R 函数来指示统计线,如第二个图。据我所知,没有 R 函数可以使线条像第二个情节。如果我使用“geom_hline”和“geom_vline”,我可以制作。但是,它在计算统计数据后手动添加行。我喜欢检查除“geom_hline”和“geom_vline”之外是否有 R 函数,以使线条像第二个绘图。
还有一个问题; 如何更改使用“geom_dotplot()”的点形状?我在 ggplot() 中尝试过,但它不起作用。我知道如果我使用“geom_point”,我可以改变形状。但是,'geom_point(shape=5)+geom_jitter' 不能制作堆叠的点,所以我应该使用'geom_dotplot'。我用谷歌搜索找到一种方法来改变“geom_dotplot”中的形状,但没有结果。
你能帮忙吗?谢谢,
解决方案
最好将水平线绘制为mean
. 您可能可以使用ungeviz
包和geom_hpline()
函数(此处的文档)来做到这一点。该软件包不适用于我的 R 版本,而且我现在不打算更新,所以这样做的“欺骗”方式是使用geom_crossbar
,而只是 make ymin=ymax=y
。
然后形状的其余部分将是 的一般结构geom_errorbar
,因此只需使用您的data_summary
函数即可。
最后,为了改变shape=
……geom_dotplot
似乎是个坏消息,它不是一种公认的审美。我能做的最好的就是 set fill=NA
,所以你有圆圈而不是实心圆点。
data_summary_collapsed <- function(x) {
m <- mean(x)
ymin <- m
ymax <- m
return(c(y=m,ymin=ymin,ymax=ymax))
}
ggplot(iris, aes(x=Species, y=Sepal.Width)) +
theme_minimal() +
geom_dotplot(binaxis='y', stackdir='center', dotsize=0.5, fill=NA) +
stat_summary(
geom='crossbar',
fun.data=data_summary_collapsed,
width=0.3,
color='blue'
) +
stat_summary(
geom='errorbar',
fun.data=data_summary,
width=0.2,
color='blue',
size=1.2
)
推荐阅读
- python - 给定行号和列号,如何在 python 中定位 XML 错误?
- python - 在设置期间生成常量
- flutter - 颤动的芯片和颜色 - 为什么 ChoiceChip 如此不同
- java - Graphql SPQR 自定义对象序列化/反序列化
- sql - SQL查询以查找分组值的所有组合
- javascript - 访问被 CORS 策略阻止的脚本
- android - UdpClient.Close() 在 Unity 中抛出 android.os.DeadObjectException(使用 IL2CPP)
- sql - 需要创建程序以查找具有大多数 emps 的部门
- python - List claims to be empty but still contains an object
- javascript - 如果删除表行,.submit() 不起作用