ggplot2中的振幅线+ geom_point

时间:2018-07-11 14:00:07

标签: r ggplot2 data-visualization

我想在此图中添加一些附加线。我必须显示水平和垂直最大和最小数据的距离,如下例所示。
就像添加没有盒子的盒子图

我尝试按照此示例进行操作,但未成功。 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

simple cars plot

修改后的版本

enter image description here

2 个答案:

答案 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))

enter image description here