【问题标题】:Amplitude lines + geom_point in ggplot2ggplot2中的幅度线+ geom_point
【发布时间】:2018-07-12 00:36:36
【问题描述】:

我想在这个情节中添加一些额外的线条。我必须从水平和垂直方向显示最大和最小数据的距离,如下例所示。
就像在没有盒子的情况下添加箱线图

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

修改版

【问题讨论】:

  • 这是一个答案,有多种方法可以制作边际直方图和地毯图:stackoverflow.com/q/8545035/5325862 它们都不是您正在寻找的开箱即用的线条,但我正在考虑方法调整这些解决方案来做一条线而不是直方图
  • 谢谢亨利克。 @camille 这将非常有用。我刚刚在我的数据库上添加了一个带有零的新列,现在我正在根据因素绘制散点图。我认为这种方法可以正常工作。
  • 您还可以查看ggExtra::ggMarginal 的内部结构。它允许您从密度、直方图、箱线图或小提琴中选择摘要,您可以按组进行操作;您也许可以复制该代码,但也许可以使用geom_segment 而不是那里使用的其他摘要

标签: r ggplot2 data-visualization


【解决方案1】:

我对此非常好奇,但发现我的首选 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 年 7 月 11 日创建。

【讨论】:

  • 这也是一个不错的选择。似乎更容易
【解决方案2】:

得到这个结果。 (在原始情节上)

我建了 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多