【问题标题】:Plot grid across columns跨列绘制网格
【发布时间】:2020-06-14 00:06:59
【问题描述】:

我有一个数据框,我想以网格方式生成多个图,并在列之间进行映射。所以它可能是每列的直方图,或者每列(x 除外)相对于 x 的散点图。

例如

ggplot(data=iris0, aes(x=Sepal.Width, y=Sepal.Length)) +
  geom_point(aes(col=Species)) +
  ylab("Sepal.Length") + ggtitle("Scatterplot of Sepal.Length against Sepal.Width")

但想在单个网格中自动生成 y=Sepal.Length、y=Petal.Length、y=Petal.Width 的图。 或例如

ggplot(data=iris0, aes(x=Sepal.Width, col=Species)) +
  geom_histogram(aes(fill = Species)) +
  ylab("Sepal.Width")

但在一个网格中自动生成四个直方图(每个属性一个)。

facet_wrapfacet_grid 将是完美的,因为他们为您安排得很好并且带有清晰的标签(看起来不错)。但我不确定在这种情况下如何应用它们(通过属性而不是像物种这样的因素)。

(首选 base-R + ggplot2 中的解决方案,但如有必要,请继续使用需要其他包的方法)

【问题讨论】:

  • 您应该将数据“融化”或重塑为长格式。我尝试使用基础 R 中的reshape() 来执行此操作,但它总是让我的大脑融化……我可能会放弃并使用reshape2tidyr 方法来执行此操作。

标签: r ggplot2


【解决方案1】:

来自 Ben Bolker 的评论,但使用 tidyr::pivot_longer()reshape() 更容易记住(以及标准 tidyverse 的一部分)。这个想法是一样的:如果你想在你的属性上使用分面,那么你的属性应该是一个因素。

library(tidyverse)

iris %>%
  pivot_longer(cols = c("Sepal.Length", "Petal.Length", "Petal.Width"),
               names_to = "attribute") %>%
  ggplot() +
  geom_point(aes(x = Sepal.Width, y = value, col = Species)) +
  facet_wrap(~attribute)

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2016-08-24
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    相关资源
    最近更新 更多