【问题标题】:R ggplot facet -- shared y axis, multiple distinct x-axesR ggplot facet -- 共享 y 轴,多个不同的 x 轴
【发布时间】:2018-06-07 22:16:05
【问题描述】:

我有一个由 3 个变量(a、b、c)和一个响应(d)组成的数据集。

    df <- structure(list(a = c(0.9973, 0.9965, 1.002, 1.0019, 1.001, 1.0031, 
1.0005, 1.0009, 1.0007, 0.9977, 1.0004, 1.001, 0.9936, 0.9945, 
1.0056, 1.0004, 0.9969, 0.9977, 1.001, 0.9876), b = c(-4.0841, 
-4.216, -4.1469, -4.1418, -4.1919, -4.1953, -4.3314, -4.1205, 
-4.2449, -4.0841, -4.276, -4.3396, -4.2885, -4.1386, -4.0689, 
-4.2229, -4.3886, -4.2267, -4.0344, -4.6152), c = c(32.04, 18.52, 
26.01, 25.65, 21.44, 22.26, 21.8, 21.6, 17.38, 13.84, 20.19, 
27.66, 20.85, 18.71, 22.18, 17.25, 26.78, 28.08, 25.9, 16.68), 
    d = c(2241, 2231, 2231, 2220, 2218, 2216, 2210, 2204, 
    2202, 2194, 2157, 2028, 1853, 1850, 1770, 1755, 1679, 
    1673, 1673, 1645)), .Names = c("a", "b", "c", "d"), class = "data.frame", row.names = c(NA, 
-20))

我的目标是在ggplot2 中使用facet 创建一个公共y 轴为d 的图,以及三个分别具有a、b 和c 轴的平面——换句话说,d vs a、d vs. b 和 d vs. c 彼此相邻且具有共同的 y 轴。我的目标的近似值可以显示在 base R 中:

par(mfrow=c(1,3))
plot(df$a, df$d)
plot(df$b, df$d)
plot(df$c, df$d)

我想用 ggplot 做到这一点,而不重复 y 轴。我见过类似的图,但它们通常涉及重复多次的一个 x 轴。我尝试melt 数据(即来自reshape2),但我还没有找到适合我的方向。

在视觉上也希望 d vs. a、d vs. b 和 d vs. c 是不同的颜色。

提前感谢您的帮助!

【问题讨论】:

标签: r plot ggplot2 facet


【解决方案1】:

你在正确的轨道上。我们需要将df 转换为长格式(例如tidyr::gather),然后使用ggplot::facet_grid 来获得所需的绘图

df <- structure(list(a = c(0.9973, 0.9965, 1.002, 1.0019, 1.001, 1.0031, 
  1.0005, 1.0009, 1.0007, 0.9977, 1.0004, 1.001, 0.9936, 0.9945, 
  1.0056, 1.0004, 0.9969, 0.9977, 1.001, 0.9876), b = c(-4.0841, 
  -4.216, -4.1469, -4.1418, -4.1919, -4.1953, -4.3314, -4.1205, 
  -4.2449, -4.0841, -4.276, -4.3396, -4.2885, -4.1386, -4.0689, 
  -4.2229, -4.3886, -4.2267, -4.0344, -4.6152), c = c(32.04, 18.52, 
  26.01, 25.65, 21.44, 22.26, 21.8, 21.6, 17.38, 13.84, 20.19, 
  27.66, 20.85, 18.71, 22.18, 17.25, 26.78, 28.08, 25.9, 16.68), 
      d = c(2241, 2231, 2231, 2220, 2218, 2216, 2210, 2204, 
      2202, 2194, 2157, 2028, 1853, 1850, 1770, 1755, 1679, 
      1673, 1673, 1645)), 
  .Names = c("a", "b", "c", "d"), 
  class = "data.frame", row.names = c(NA,-20))

library(tidyverse)

df_long <- df %>% 
  gather(key, value, a:c)

ggplot(df_long, aes(x = d, y = value, color = key)) +
  geom_point() +
  facet_grid(~ key) +
  theme_bw()

ggplot(df_long, aes(x = d, y = value, color = key)) +
  geom_line() +
  facet_grid(~ key)+
  theme_bw()

ggplot(df_long, aes(x = d, y = value, color = key, fill = key)) +
  geom_col() +
  facet_grid(~ key)+
  theme_bw()

reprex package (v0.2.0) 于 2018 年 6 月 7 日创建。

【讨论】:

  • 谢谢,很接近,但不太正确。我需要将“d”作为 y 轴(所有三个图共有),然后从右到左,我希望这些图分别具有 a、b 和 c 作为 x 轴。不幸的是,简单地翻转代码中的 x 和 y 会产生不良结果:ggplot(df_long, aes(x = key, y = d, color = key)) + geom_point() + facet_grid(~ key)
【解决方案2】:

感谢 Tung 和 Amanda 让我走上正轨。关键是使用facet_wrap 而不是facet_grid。一旦数据采用上述正确的长格式:

library(tidyverse) 
df_long <- df %>% 
   gather(key, value, a:c)

那么这个版本就可以了:

ggplot(df_long, aes(x = value, y = d, color = key)) +
    geom_point() +
    facet_wrap(~ key, scales="free_x")

【讨论】:

  • 你得到与facet_grid(~ key, scales = "free_x")相同的结果
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2020-06-11
  • 2021-12-19
  • 2021-07-05
  • 1970-01-01
相关资源
最近更新 更多