- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这个问题的动机是进一步探索这个question 。当每个面的条数差异较大时,所接受的解决方案的问题变得更加明显。查看此数据以及使用该解决方案得出的结果图:
# create slightly contrived data to better highlight width problems
data <- data.frame(ID=factor(c(rep(1,9), rep(2,6), rep(3,6), rep(4,3), rep(5,3))),
TYPE=factor(rep(1:3,length(ID)/3)),
TIME=factor(c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1,1)),
VAL=runif(27))
# implement previously suggested solution
base.width <- 0.9
data$w <- base.width
# facet two has 3 bars compared to facet one's 5 bars
data$w[data$TIME==2] <- base.width * 3/5
# facet 3 has 1 bar compared to facet one's 5 bars
data$w[data$TIME==3] <- base.width * 1/5
ggplot(data, aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~TIME, ncol=1, scale="free") +
geom_bar(position="stack", aes(width = w),stat = "identity") +
coord_flip()
您会注意到宽度看起来完全正确,但第 3 方面的空白非常明显。据我所知,在 ggplot2 中还没有简单的方法可以解决这个问题(facet_wrap 没有 space
选项)。
下一步是尝试使用 gridExtra 解决此问题:
# create each of the three plots, don't worry about legend for now
p1 <- ggplot(data[data$TIME==1,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
p2 <- ggplot(data[data$TIME==2,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
p3 <- ggplot(data[data$TIME==3,], aes(x=ID, y=VAL, fill=TYPE)) +
facet_wrap(~ TIME, ncol=1) +
geom_bar(position="stack", show_guide=FALSE) +
coord_flip()
# use similar arithmetic to try and get layout correct
require(gridExtra)
heights <- c(5, 3, 1) / sum(5, 3, 1)
print(arrangeGrob(p1 ,p2, p3, ncol=1,
heights=heights))
您会注意到,我使用了之前根据每个面的条数建议的相同算术,但在这种情况下,它最终会出现严重错误。这似乎是因为我需要在数学中考虑额外的“恒定高度”元素。
另一个复杂的问题(我相信)是最终输出(以及宽度是否匹配)还将取决于我输出最终 grob 的位置的宽度和高度,无论它是否在 R/RStudio 环境中,或 PNG 文件。
我怎样才能做到这一点?
最佳答案
类似的东西似乎有效,但实际上并不有效——不完全有效。它看起来有效,因为 ID 因子的级别是连续的。任何其他内容,scale = "free"
都会失败。但或许还有进一步发展的可能。该方法使用facet_grid
,因此可以使用space = "free"
。该方法使用 geom_rect 将不同颜色的矩形叠加在一起。需要计算累加和,以便定位每个矩形的右边缘。
data <- data.frame(ID=factor(c(rep(1,9), rep(2,6), rep(3,6), rep(4,3), rep(5,3))),
TYPE=factor(rep(1:3,3)),
TIME=factor(c(1,1,1,2,2,2,3,3,3,1,1,1,2,2,2,1,1,1,2,2,2,1,1,1,1,1,1)),
VAL=runif(27))
library(ggplot2)
library(plyr)
# Get the cumulative sums
data = ddply(data, .(ID, TIME), mutate, CUMSUMVAL = cumsum(VAL))
ggplot(data, aes(x=VAL, y = as.numeric(ID), fill=TYPE)) +
geom_rect(data = subset(data, TYPE == 3), aes(xmin = 0, xmax = CUMSUMVAL, ymin = as.numeric(ID)-.2, ymax = as.numeric(ID)+.2)) +
geom_rect(data = subset(data, TYPE == 2), aes(xmin = 0, xmax = CUMSUMVAL, ymin = as.numeric(ID)-.2, ymax = as.numeric(ID)+.2)) +
geom_rect(data = subset(data, TYPE == 1), aes(xmin = 0, xmax = CUMSUMVAL, ymin = as.numeric(ID)-.2, ymax = as.numeric(ID)+.2)) +
facet_grid(TIME~., space = "free", scale="free") +
scale_y_continuous(breaks = c(1:5), expand = c(0, 0.2))
编辑:或者真正的粗线效果更好一点(我认为)
ggplot(data, aes(x=VAL, y = ID, colour=TYPE)) +
geom_segment(data = subset(data, TYPE == 3), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
geom_segment(data = subset(data, TYPE == 2), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
geom_segment(data = subset(data, TYPE == 1), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
facet_grid(TIME~., space = "free", scale="free")
其他编辑从您之前的帖子中获取数据,并进行一些修改。
更新 opts
已弃用;使用主题
代替。
df <- structure(list(ID = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 5L,
5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 6L, 7L, 7L, 7L), .Label = c("a",
"b", "c", "d", "e", "f", "g"), class = "factor"), TYPE = structure(c(1L,
2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L,
1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L,
5L, 6L, 1L, 2L, 3L), .Label = c("1", "2", "3", "4", "5", "6",
"7", "8"), class = "factor"), TIME = structure(c(2L, 2L, 2L,
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L,
1L, 1L, 1L), .Label = c("One", "Five", "Fifteen"), class = "factor"), VAL = c(0.937377670081332,
0.522220720537007, 0.278690102742985, 0.967633064137772, 0.116124767344445,
0.0544306698720902, 0.470229141646996, 0.62017166428268, 0.195459847105667,
0.732876230962574, 0.996336271753535, 0.983087373664603, 0.666449476964772,
0.291554537601769, 0.167933790013194, 0.860138458199799, 0.172361251665279,
0.833266809117049, 0.620465772924945, 0.786503327777609, 0.761877260869369,
0.425386636285111, 0.612077651312575, 0.178726130630821, 0.528709076810628,
0.492527724476531, 0.472576208412647, 0.0702785139437765, 0.696220921119675,
0.230852259788662, 0.359884874196723, 0.518227979075164, 0.259466265095398,
0.149970305617899, 0.00682218233123422, 0.463400925742462, 0.924704828299582,
0.229068386601284)), .Names = c("ID", "TYPE", "TIME", "VAL"), row.names = c(NA,
-38L), class = "data.frame")
library(ggplot2)
library(plyr)
data = ddply(df, .(ID, TIME), mutate, CUMSUMVAL = cumsum(VAL))
ggplot(data, aes(x=VAL, y = ID, colour=TYPE)) +
geom_segment(data = subset(data, TYPE == 6), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
geom_segment(data = subset(data, TYPE == 5), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
geom_segment(data = subset(data, TYPE == 4), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
geom_segment(data = subset(data, TYPE == 3), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
geom_segment(data = subset(data, TYPE == 2), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
geom_segment(data = subset(data, TYPE == 1), aes(x = 0, xend = CUMSUMVAL, y = ID, yend = ID), size = 10) +
facet_grid(TIME~., space = "free", scale="free") +
theme(strip.text.y = element_text(angle = 0))
关于r - ggplot2 + gridExtra : how to ensure geom_bar in different size plot grobs result in exact same bar width,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11606441/
我在绘制简单摘要时遇到问题。 library(gridExtra) SummaryTable 从 ?tableGrob 开始,它的第一个参数是矩阵或 data.frame。 t 将 summary
我正在使用 R 的 gridExtra 包。 我想将第二列的数字向左对齐,而不改变第一列名称的对齐方式。是否可以? 谢谢! library(gridExtra) library(grid) names
有一种绘制多个图形的非常方便的方法,那就是使用 gridExtra - grid.arrange: grid.arrange(plot1,plot2,plot3,plot4,plot5,plot6,p
我花了很多时间试图将 11 个图形放在一个图中并使用 gridExtra 排列它们,但我失败了,所以我求助于您,希望您能提供帮助。 我有 11 种钻石分类(称为 size1 )和其他 11 种分类(
问题: 我使用 gridExtra 创建了一个表包裹: require("gridExtra") # Prepare data frame col1 = c(rep("A", 3), rep("B",
我正在尝试排列由 ggplot2 生成的一些图使用 gridExtra包裹。 library(ggplot2) library(gridExtra) p1 = 2.0.0,main参数已重命名 top
我想完美地对齐这些图: 这是R代码: library(tidyverse) library(gridExtra) groupes % filter(type==1) %>% ggplot(aes(pr
我想用 ggplot 绘制一个表格,但是似乎无法丢失 row.names。 我试过了: row.names(cov_table_a)<-NULL # outside the plot row.name
这个问题在这里已经有了答案: Three ggplots in a 2x2 grid (1 个回答) 关闭 1 年前。 我想按以下方式布置三个地 block : [FirstPlot] [2nd]
我有以下数据框 df section_name #> 1 WWW #> 2 WWW:XXX:YYY #> 3 WWW:ZZZ #> 4 WWW:ZZZ:
我在我的 WPF 应用程序中使用 grid extra 来设计各个响应式组件。我有如下 View :
我有一系列调查问题,正在报告学校、学校家庭和整个董事会的答复。有些问题很长——我想做的是让文本在专栏结束时自动换行。现在我必须手动添加换行符。这可能吗?我使用的是 R 版本 3.2.1 和 gridE
我想安排我的ggpairs与 arrangeGrob 一起绘制: library(GGally) library(gridExtra) df ggplotGrob(qplot(1:100)) sta
我已经使用 gridExtra 创建了 2 个彼此相邻的图,我可以使用 ggsave 保存对象 但是,gridExtra 中的绘图未对齐,所以我使用了这种方法 #Method 2 - gtable
我使用 gridExtra::grid.arrange 将多个图放入一张图像中并且希望可以选择将组合图保存为一个对象,该对象可以作为返回对象列表的一部分从函数内返回。理想情况下,我想在不打印绘图对象的
我正在使用 R Shiny 想在 gridExtra 的帮助下并排放置几个 ggplotly 图。 一个 plotly (没有 gridExtra)工作得很好: library(shiny) libr
我知道 gridExtra 已更新。结果,我想知道如何更改标题大小。这不再有效 grid.arrange(a, b, c, d,ncol=2, nrow=2, main=textGr
我正在使用 xyplot (lattice) 生成四个图,并进一步将它们与 grid.arrange (gridExtra) 组合。 我想获得一个具有通用全局图例的图表。我所达到的最接近的是以下内容。
我正在使用 gridExtra 结合 Ggplot 的条形图制作摘要图。 问题是我想让摘要对 radioButtons 输入有反应。 我想要实现的目标: 我有什么: 我确定是因为使用了我在服务器中使用
在对齐网格图形对象时遇到了一些麻烦——我已经阅读了我能找到的所有文档,包括 Murrell 的书,但没有成功。我认为我正在尝试做的事情非常简单,所以希望我缺少简单的东西。 这是一个可重现的示例,它将按
我是一名优秀的程序员,十分优秀!