- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在使用 R/ggplot2 成功生成与我公司使用的商业工具生成的图表非常接近的图表。但是有一些功能我无法在使用 R 生成的箱线图中实现。
示例 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生成的输出在这里,
商业工具生成的相同箱线图在这里,
如您所见,图表中的数据是相同的(正如预期的那样),但 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)
这个脚本现在给我一个图表,如下所示,
此图的问题是面板在左侧略微未对齐。关于如何对齐面板的左侧和右侧有什么建议吗?
谢谢,
最佳答案
我认为你应该只使用一个方面级别,而不是在传递给 '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()
如果您比较这些情节,我认为很明显我创建的情节以一种更容易理解的方式传达信息。 1999 年和 2008 年每加仑英里数之间的比较对于观众来说更容易在每个“制造商”中看到。颜色有帮助,并且刻面划分仅处于“最高级别”,这允许进行适当的组内比较。
关于r - 如何向 geom_boxplot 添加摘要信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23970118/
我最近发布了一个 problem我正在进行身份验证,但没有收到任何回复,所以我想到了另一种方式来提问而不是多余的。 我在应用程序中看到的内容 documentation是传递访问 token 以进行身
我有一个具有许多不同值的因素。如果执行 summary(factor)输出是不同值及其频率的列表。像这样: A B C D 3 3 1 5 我想制作频率值的直方图,即 X 轴包含发生的不同频率,Y 轴
我有 2 个表,其中包含一组数据,如下所示,我想获得 RESULT 中的结果,该结果将在字段 balance 中进行计算: 我被困在余额字段中,如何让余额运行? tblIn in_date |
我有一个大量重载的方法 MethodA,它由我的 MethodB 文档中的摘要标记引用: /// A link to void MethodB { ... } 注释不应仅依赖于 MethodA 的特
当我将新的 details 标签与 summary 结合使用时,我想禁用生成的输入。我以为 可以解决这个问题,但遗憾的是它不起作用。 如何禁用细节元素? 最佳答案 一个非常简单的方法是只使用 CSS
如何在 Visual Studio 中生成此类摘要? /// /// Returns a number /// /// /// 最佳答案 在你的方法、属性等之前输入///,VS会自动生成注释
关于简单的看似无辜的函数的简单问题:summary。 直到我看到min和max的结果超出了我的数据范围,我才意识到summary有一个指定输出结果精度的参数。我的问题是如何以一种干净、普遍的方式来解决
我有一个数据框 a,其中包含 4 个标识列:A、B、C、D。使用 ddply() 创建的第二个数据框 b 包含每组 的不同 D 的所有值的摘要>A、B、C。第三个数据框 c 包含 b 的子集,其中包含
这个问题在这里已经有了答案: jsdoc: multiline description @property (4 个回答) 4年前关闭。 我正在为我的 javascript 项目使用 Visual S
我有一个向量的 R 摘要: summary(vector) Min. 1st Qu. Median Mean 3rd Qu. Max. 1.000 1.000 2.000 6
我想创建一个新的计算列(另一列文本的摘要)。为了让您重现,我创建了一个 df 作为可重现的示例: df head(df,3) name 1 ZKBOZVFKNJBRSDW
假设我有一棵对象树,其中每个对象都有一个字符串表示。我想在整棵树上创建一个 SHA1 摘要。 最简单的方法是递归遍历树的每个节点。对于每个节点,我将连接(作为简单字符串)所有子节点的 SHA1 摘要,
因此,我试图围绕 MVVM 进行思考,但我发现我的问题多于答案。当涉及到下一步时,这些教程对我来说还远远不够...... 基本上我想要一个项目列表,然后是一种获取每个项目详细信息的方法。 下面是我在网
我希望将 princomp PCA(必须是 princomp)的摘要作为数据框,以便我可以使用 kable 格式化表格以生成报告。 这是我尝试使用的代码,从中应该清楚我想要做什么; kable( as
我们的一页很重。为了减少我们的观察者数量并加速 Angular 摘要周期,我们大量使用了 On-Time-Binding 语法 :: .我们也在使用angular-bind-notifier以避免对我
我正在与我受雇的公司合作,试图为我们的内部库创建更好的文档。我们希望最终检查每个类并更新我们的命名方案(过去有很多草率的代码)。我想要的是能够打印出 javadoc 的摘要。它需要排除页面底部的完整解
我正在尝试创建一个分组摘要,报告每个组中的记录数,然后还显示一系列变量的均值。 我只能弄清楚如何将其作为两个单独的摘要进行处理,然后再将它们合并在一起。这工作正常,但我想知道是否有更优雅的方法来做到这
我正在尝试从 this file 中获取带有百分比的交叉表使用 Hmisc .但为什么是summary()从变量 OCCUPATION 中删除类别(“OTHERS”)? library(Hmisc)
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
如标题所示,我想为 PreferenceAcitvity 创建自定义标题栏。我需要在标题下方添加摘要。目前它只会显示一个标题,但我需要一个副标题,就像任何 Preference 都可以有一个摘要。 我
我是一名优秀的程序员,十分优秀!