我想在此图中添加一些附加线。我必须显示水平和垂直最大和最小数据的距离,如下例所示。
就像添加没有盒子的盒子图
我尝试按照此示例进行操作,但未成功。 Avoid plot overlay using geom_point in ggplot2
我是在photoshop上完成的。但是,如何添加R?
原始图
plot <- ggplot(mtcars, aes(x = wt, y = mpg, colour = factor(gear))) +
geom_point() +
ggtitle("Cars")
plot
修改后的版本
答案 0 :(得分:2)
对此我感到非常好奇,但是发现我的研究对象cowplot
不能正确分配地块。软件包编写者本人suggested using patchwork
代替了更复杂的间距和对齐方式。使用cowplot
,我制作了一个假人ggplot
来将右上角保留为空白,但无法获得正确的高度。 patchwork
可以使用plot_spacing
函数来做到这一点。
第一个任务是制作用于绘制线条的摘要数据框。我添加了一个行号,因此有一种方法可以垂直堆叠行的顶部边缘,水平堆叠行的右侧边缘。 (我想一个哑数值,position_dodge
可能也起作用。)
library(tidyverse)
library(patchwork)
summaries <- mtcars %>%
group_by(gear) %>%
summarise(minwt = min(wt), maxwt = max(wt), minmpg = min(mpg), maxmpg = max(mpg)) %>%
ungroup() %>%
mutate(row = row_number())
summaries
#> # A tibble: 3 x 6
#> gear minwt maxwt minmpg maxmpg row
#> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 3 2.46 5.42 10.4 21.5 1
#> 2 4 1.62 3.44 17.8 33.9 2
#> 3 5 1.51 3.57 15 30.4 3
我使用相同的ggplot
基数绘制了顶部和右侧的图,并给了它们theme_void
,因此除了线段本身之外,没有任何显示。我建议您以不同的主题进行介绍,以便您了解情节如何融合在一起。
summary_base <- ggplot(summaries, aes(color = factor(gear)))
top <- summary_base +
geom_segment(aes(x = minwt, xend = maxwt, y = row, yend = row), show.legend = F) +
theme_void()
right <- summary_base +
geom_segment(aes(x = row, xend = row, y = minmpg, yend = maxmpg), show.legend = F) +
theme_void()
然后是主要情节:
points <- ggplot(mtcars, aes(x = wt, y = mpg, color = factor(gear))) +
geom_point() +
theme(legend.position = "bottom")
然后patchwork
允许您仅将图加在一起。它们从左到右,从上到下,所以为了获得右上角的空白,我使用了plot_spacer
。然后plot_layout
设置网格。您可以根据需要调整相对的高度和宽度-可能会使它们更窄。这是我第一次使用patchwork
,但是非常简单。
top + plot_spacer() + points + right +
plot_layout(ncol = 2, nrow = 2, widths = c(1, 0.2), heights = c(0.2, 1))
由reprex package(v0.2.0)于2018-07-11创建。
答案 1 :(得分:1)
得到了这个结果。 (在原始图上)
我建立了3个地块+一个空地,如此处所示:Scatterplot with marginal histograms in ggplot2
我使用的水平和垂直图:
horizontal <- ggplot(mtcars, aes(wt, gear, colour = factor(gear)) +
geom_point() +
geom_line() +
theme(legend.position = "none",
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
plot.margin=unit(c(0,1,-0.4,0.7), "cm")) +
xlab("") + ylab("")
horizontal <- ggplot(mtcars, aes(gear, mpg, colour = factor(gear)) +
geom_point() +
geom_line() +
theme(legend.position = "none",
panel.background = element_blank(),
panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
axis.text.x = element_blank(),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
plot.margin=unit(c(0,1,-0.4,0.7), "cm")) +
xlab("") + ylab("")
最好的管理方法是管理每个图的边距。
然后是空的情节
empty <- ggplot()+geom_point(aes(1,1), colour="white")+
theme(axis.ticks=element_blank(),
panel.background=element_blank(),
axis.text.x=element_blank(), axis.text.y=element_blank(),
axis.title.x=element_blank(), axis.title.y=element_blank())
所以,加入一切
grid.arrange(horizontal, empty, plot, vertical, ncol=2, nrow=2,
widths=c(1, 0.05), heights=c(0.5, 4))