gpt4 book ai didi

r - 如何向 geom_boxplot 添加摘要信息

转载 作者:行者123 更新时间:2023-12-04 18:07:02 30 4
gpt4 key购买 nike

我一直在使用 R/ggplot2 成功生成与我公司使用的商业工具生成的图表非常接近的图表。但是有一些功能我无法在使用 R 生成的箱线图中实现。

  1. 图表底部的摘要“表格”,显示中位数、计数、离群值等项目。
  2. 显示 strip 文本,以便删除重复的标签。

示例 R 代码:

library(ggplot2)
library(data.table)
library(reshape2)
library(grid)

# create dataset
dt <- data.table(mpg)

# melt the data table
dtm <- data.table(
melt(data=dt,
id.vars=c("manufacturer","model","displ","year","cyl","trans","drv","fl","class"),
variable.name="mode", value.name="mpg"))
write.csv(dtm,file="dtm.csv",row.names=F)

# draw some plots
p <- ggplot(dtm, aes(x=mode,y=mpg)) +
geom_boxplot(aes(fill=mode), varwidth=F) +
facet_grid( ~ manufacturer + year ) +
theme_bw() +
theme(panel.margin=unit(0,"mm"), panel.grid=element_blank()) +
theme(axis.text.x=element_blank(), axis.title.x=element_blank()) +
theme(legend.position="bottom") +
coord_cartesian(ylim=c(0,50))
p

ggsave(plot=p, filename='ddtm_r.png', dpi=72, width=16, height=8)

R生成的输出在这里,

R/ggplot2 generated boxplot

商业工具生成的相同箱线图在这里,

boxplot generated by commercial tool

如您所见,图表中的数据是相同的(正如预期的那样),但 strip 标题在商业版本中组织得更好,我也可以在图表底部添加汇总表。

在 R 中有什么方法可以做类似的事情吗?

谢谢和问候,

德里克

更新时间:2014 年 6 月 7 日

根据同事的建议和在线帮助,我现在可以绘制包含箱线图的图形,并在箱线图底部附加汇总表。主要思想是从箱线图 grob 中提取面板信息,然后用它来生成文本表,然后用这两个 grob 重新绘制图。必须删除原始箱线图的图例才能获得正确的右侧对齐。

修改后的R代码如下,

# load the libraries
library(grid)
library(gridExtra)
library(data.table)
library(reshape2)
library(ggplot2)
library(gtable)
library(plyr)

# create dataset
dt <- data.table(mpg)

# melt the data table
dtm <- data.table(
melt(data=dt,
id.vars=c("manufacturer","model","displ","year","cyl","trans","drv","fl","class"),
variable.name="mode", value.name="mpg"))
#write.csv(dtm,file="dtm.csv",row.names=F)

# draw some plots
p1 <- ggplot(dtm, aes(x=factor(year),y=mpg)) +
geom_boxplot(aes(fill=factor(year)), varwidth=F) +
facet_grid( ~ manufacturer + mode ) +
theme_bw() +
theme(panel.margin=unit(0,"lines"),
panel.grid=element_blank(),
strip.text=element_text(angle=90),
axis.text.x=element_blank(),
axis.title.x=element_blank(),
axis.ticks.x=element_blank(),
plot.margin=unit(c(0,0,0,0),"lines"),
legend.position="right") +
coord_cartesian(ylim=c(0,50)) +
xlab(NULL)

# deconstruct the plot p1
pb <- ggplot_build(p1)
# pb has three groups; data, panel and plot
pb.data <- pb$data
# pb.data[[1]] is a data.frame
pb.data.df <- pb.data[[1]]
# melt the pb.data.df
pb.data.dt <- data.table(pb.data.df)
#pb.data.dt[,':='(outliers=NULL)]
pb.data.dtm <- melt(data=pb.data.dt,
#id.vars=c("x","PANEL"),
measure.vars=c("middle","lower","upper"),
variable.name="mode",
value.name="value")

p2 <- ggplot(pb.data.dtm, aes(x=factor(x),y=factor(mode),label=format(value,nsmall=1))) +
geom_text(size=3.0, angle=90, hjust=0.5) + facet_grid(~ PANEL) +
theme_bw() +
scale_y_discrete() +
theme(panel.margin=unit(0,"lines"),
panel.grid=element_blank(),
panel.border=element_rect(),
legend.position="right",
axis.text.x=element_blank(),
axis.text.y=element_text(angle=0),
axis.ticks=element_blank(),
strip.text=element_blank(),
strip.background=element_blank(),
plot.margin=unit(c(0,0,0,0),"lines")
) +
xlab(NULL) + ylab(NULL)

# a function to extract the legend from the grob
g_legend <- function(a.gplot) {
tmp <- ggplotGrob(a.gplot)
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
legend
}
legend1 <- g_legend(p1)
pa <- arrangeGrob((p1 + theme(legend.position='none')), legend1,
(p2 + theme(legend.position='none')),
ncol=2, nrow=2,
heights=c(50/60,10/60), widths=c(95/100,5/100))
ggsave(plot=pa, filename='dtm_r.png',dpi=72,height=10,width=18)

这个脚本现在给我一个图表,如下所示,

Boxplot with summary table below it

此图的问题是面板在左侧略微未对齐。关于如何对齐面板的左侧和右侧有什么建议吗?

谢谢,

最佳答案

我认为你应该只使用一个方面级别,而不是在传递给 'fill' 的分组参数中包含年份:

 p <- ggplot(dtm, aes(x=mode,y=mpg)) +
geom_boxplot(aes(fill=interaction(mode,year) ), varwidth=F) +
facet_grid( ~ manufacturer ) +
theme_bw() +
theme(panel.margin=unit(0,"mm"), panel.grid=element_blank()) +
theme(axis.text.x=element_blank(), axis.title.x=element_blank()) +
theme(legend.position="bottom") +
coord_cartesian(ylim=c(0,50))

p

品牌之间的划分更加明显。此外,您可以明确修改主题参数,使品牌名称完全可见:

png(width=650) ; p <- p + theme(strip.text.x = element_text(size=8, angle=75)); 
print(p); dev.off()

enter image description here

如果您比较这些情节,我认为很明显我创建的情节以一种更容易理解的方式传达信息。 1999 年和 2008 年每加仑英里数之间的比较对于观众来说更容易在每个“制造商”中看到。颜色有帮助,并且刻面划分仅处于“最高级别”,这允许进行适当的组内比较。

关于r - 如何向 geom_boxplot 添加摘要信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23970118/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com