- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
代码
library(ggplot2)
library(dplyr)
mydata = tribble(
~x, ~y, ~data, ~more,
0, 50, 'iris', 'this',
10, 100, 'iris', 'this',
0, 50, 'iris', 'that',
10, 100, 'iris', 'that',
0, 0, 'wine', 'this',
10, 10, 'wine', 'this',
0, 0, 'wine', 'that',
10, 10, 'wine', 'that',
)
ggplot(mydata, aes(x,y)) + facet_grid(data~more, scale='free') + theme_gray() + geom_point()
ggplot(mydata, aes(x,y)) + facet_grid(more~data, scale='free') + theme_gray() + geom_point()
我正在获取图形:
请注意,第一个图表填充面板中的空间有多好。由于我的真实情节的颜色编码,我不需要显示“这个”和“那个”,所以我想在第一个情节中去掉它。但是旁边的数据标签很奇怪。我更希望他们是这样的:
这类似于 ggplot2: Using gtable to move strip labels to top of panel for facet_grid ,但其他链接对我不起作用,我认为情况有点不同。
我该怎么做?
最佳答案
要让 strip 跨越列,您可能需要使用 gtable
函数(以及几个 grid
函数)。
在解决方案中,行被添加到图表的 gtable,然后条被添加到新行。 strip 可以从头开始构造,但绘制第二张 strip 水平方向的图表可能更容易,然后提取 strip 。
(注意:这很容易与下一个 ggplot 版本冲突。)
library(ggplot2)
library(dplyr)
mydata = tribble(
~x, ~y, ~data, ~more,
0, 50, 'iris', 'this',
10, 100, 'iris', 'this',
0, 50, 'iris', 'that',
10, 100, 'iris', 'that',
0, 0, 'wine', 'this',
10, 10, 'wine', 'this',
0, 0, 'wine', 'that',
10, 10, 'wine', 'that',
)
### Construct two charts:
# 1. ToKeep - the data~more chart, but without the strip labels.
# The strips across the tops of the two rows of panels will be added later.
(ToKeep <- ggplot(mydata, aes(x,y)) +
facet_grid(data ~ more, scale ='free') +
geom_point() +
theme(strip.text.y = element_blank(),
strip.text.x= element_blank()) )
# 2. ToGetStrip - Get the strips from the more~data chart
ToGetStrip <- ggplot(mydata, aes(x,y)) +
facet_grid(more ~ data, scale = 'free') +
geom_point()
# Get the ggplot grob
gt = ggplotGrob(ToGetStrip)
# Get the strips
library(gtable)
library(grid)
strip = gtable_filter(grid.force(gt), "strip-t")
# Make sure
grid.newpage()
grid.draw(strip$grobs[[1]])
grid.newpage()
grid.draw(strip$grobs[[2]])
## Add the strips to the ToKeep chart.
# Get ggplot grob
gt = ggplotGrob(ToKeep)
# Check heights and widths
gt$heights
gt$widths
# The 1null heights and widths are the panels' heights and widths.
# Add rows to the gtable immediately above the panel rows (that is, after row 9 then row 7).
# The height of the new rows is the height of the strip grobs.
gt <- gtable_add_rows(gt, height = strip$grobs[[1]]$height, pos = 9)
gt <- gtable_add_rows(gt, height = strip$grobs[[1]]$height, pos = 7)
# Add the strips to the new rows ( t = c(8, 11) )
# and make sure they span the two columns of panels ( l = 5, r = 7 )
gt <- gtable_add_grob(gt, list(strip$grobs[[1]], strip$grobs[[2]]), t = c(8, 11), l = 5, r = 7)
# Draw it
grid.newpage()
grid.draw(gt)
以下是尝试根据面板位置选择行和列。然而,它还没有在你的 2 X 2 图表之外进行测试。 (这可能对 ggplot 的更改更具弹性。)
# Construct the two charts
ToKeep <- ggplot(mydata, aes(x,y)) +
facet_grid(data ~ more, scale ='free') +
geom_point() +
theme(strip.text.y = element_blank(),
strip.text.x= element_blank())
ToGetStrip <- ggplot(mydata, aes(x,y)) +
facet_grid(more ~ data, scale = 'free') +
geom_point()
# Get the strips from the second chart
gt = ggplotGrob(ToGetStrip)
library(grid)
library(gtable)
strip = gtable_filter(grid.force(gt), "strip-t")
# Add rows to the ToKeep chart, and add the strips to the new rows
gt = ggplotGrob(ToKeep)
PanelPos = subset(gt$layout, grepl("panel", gt$layout$name), select = t:r)
PanelRows = rev(unique(PanelPos$t))
for(i in seq_along(PanelRows)) {
gt <- gtable_add_rows(gt, height = strip$grobs[[1]]$height, pos = PanelRows[i]-1)
}
PanelRows = unique(subset(gt$layout, grepl("panel", gt$layout$name), select = t, drop = TRUE))
gt <- gtable_add_grob(gt, strip$grobs, t = PanelRows - 1, l = min(PanelPos$l), r = max(PanelPos$r))
# Draw it
grid.newpage()
grid.draw(gt)
关于r - 使用 strip.y 作为 strip.x 而不翻转 facet_grid 轴,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52458376/
我有一个大致如下所示的数据集: names = tibble(NAME_2=c("Location1","Location2","Location3","Location4")) dates = ti
问题是什么? ggplot2 中的每个方面可能不包含“名称”列中的所有因子水平,在这种情况下,我希望该方面忽略这些因子水平以避免图 block 中的间隙。 我尝试了什么 我尝试在 中添加和删除 sca
我想使用分面网格只显示右边距而不是底部边距。 示例代码 library(ggplot2) qplot(mpg, wt, data=mtcars) + facet_grid(cyl ~ vs, marg
我刚刚在 ggplot2 0.9 中遇到了 facet_grid() 的奇怪行为,我想知道是否有人可以向我解释一下...... 采用以下 df 数据框: var <- sample(c("red",
我有以下数据框: Date K Row Col Downward_solar_radiation Solar_radiation_calc 1 2014-01-02 1 1 1
这是 this question 的变体和 this question我还没有找到解决方案。 以mtcars为例,我想要一个类似下面的情节 ggplot(mtcars, aes(x=cyl,y=mpg
我想在一组分面网格箱线图的每一行中添加一条唯一的水平线。 x<-c("species_X","species_X","species_X", "species_Y","species_Y",
我希望有人可以帮助解决我遇到的这个绘图问题。资料可查here . 基本上,我想为我测试的 4 个模型绘制一条线(平均值)及其相关的置信区间(下、上)。我想对 Cat_Auth 变量进行分面,该变量有
我很难为我的 2 个不同的 facet_grids 获得不同的颜色。 这是我的简单示例: df <- data.frame(x = rep(1:20, each=20), y= rep(1:20, 2
我想从多面 ggplot2 图中有选择地删除不必要的方面。我看过这个问题,但不知道怎么做(也许那里的建议现在已经过时了): adding empty graphs to facet_wrap in g
我正在寻找一种使用 facet_grid 进行绘图的方法在 ggplot2只显示几个选定的方面。说我有以下情节: 例如,一直在寻找一种快速的方法来绘制方面 1 和 3。 #data y<-1:12 x
我有几个关于 ggplot2 分面的问题... 假设我有一个查询返回如下所示的数据: (请注意,它是按 Rank asc 排序的,Alarm asc 和两个 Alarms 的 Rank 为 3,因为它
我有一个如下所示的数据框: Direction ID RY Value Part_of_prog North 1 2016 29 0 No
我想同时显示右侧和底部边距,但不是两者的组合。这可能与 facet_grid 吗? library(ggplot2) ggplot(mtcars, aes(x = hp, group = vs)) +
在我下面的情节中,我想知道如何保持一切不变,但只是删除空的情节? library(tidyverse) hsb <- read.csv('https://raw.githubusercontent.c
以下示例创建了一个 ggplot与 4 个面板“A”、“B”、“C”、“D”排成一排。 我想出了如何在一列中绘制这 4 个面板。然而,仍然是个谜是如何排列 4 个面板,使“A”和“B”在第一行,而“C
我想要的是删除右侧的那些标签,即侧面灰色框上的标签。我举个例子: p <- ggplot(mtcars, aes(mpg, wt, col=factor(cyl))) + geom_point() p
我想使用 facet_grid 在彼此之上绘制一些条形图: library(ggplot2) df % summarise(cty = mean(cty), hwy = mean(hwy)) %>
我正在使用 中的“提示”数据集ggplot2 .如果我做 sp = ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + geom_
在 ggplot , 当使用 facet_grid(..., space = "free_y")并且组内的点数很少,分面标题被切断。 例如... library(tidyverse) d pg Ta
我是一名优秀的程序员,十分优秀!