【问题标题】:How to plot multiple graphs (faceting) using twoord.plot () in R?如何在 R 中使用 twoord.plot () 绘制多个图(分面)?
【发布时间】:2017-09-05 13:43:46
【问题描述】:

我的数据如下所示:

height <- c(1,2,3,4,2,4,6,8)
weight <- c(12,13,14,15,22,23,24,25)
person <- c("Jack","Jim","Jill","Tess","Jack","Jim","Jill","Tess")
set <- c(1,1,1,1,2,2,2,2)
dat <- data.frame(set,person,height,weight)

我正在尝试使用 plotrix 包中的 twoord.plot 函数绘制具有相同 x 轴(人)和 2 个不同 y 轴(体重和身高)的图形。 但是,我不知道如何像 ggplot2 中那样刻面。

例如,如果我的绘图可以覆盖在 ggplot2 中,我的代码将如下所示:

ggplot(data = dat, aes(x = person, y = weight)) + 
  geom_point(color = "red") + facet_wrap(~set, scales="free") 
#And similarly have the height on the other axis.

关于如何在 twoord.plot() 中实现这一点的任何想法?

【问题讨论】:

  • the documentation看来这个函数没有使用facets。
  • 我知道。但我想知道是否有什么“技巧”可以用来解决这个问题?
  • 没有“技巧”。您必须对数据进行子集化,生成单独的图并使用例如 par(mfrow = ...)panes 组合它们。但我想知道你为什么不简单地使用ggplot2
  • 因为 ggplot2 给我带来了很多麻烦。我尝试使用 sec_axis(),但似乎没有人知道正确的解决方案。见这里:stackoverflow.com/questions/46045258/…

标签: r plot multiple-axes


【解决方案1】:

我觉得这个情节真的很混乱,但这似乎或多或少是plotrix::twoord.plot 所做的,所以如果这就是你的想法,请告诉我。

在 ggplot2 中,第二个轴必须基于第一个轴的变换。因此,我们首先转换绘制的高度值,使其与体重值处于同一范围内(因此它们将出现在基于体重的图表的 y 范围内)。然后我们对第二个y轴的比例进行逆变换(这样y轴的比例就会对应数据中的实际高度值)。

ggplot(dat, aes(person)) + 
  geom_point(aes(y=weight), colour="blue") + 
  geom_point(aes(y=height/mean(height/weight)), colour="red", shape=17) +
  scale_y_continuous(sec.axis=sec_axis(~ . * mean(dat$height/dat$weight), 
                                       breaks=seq(0,max(dat$height),1),
                                       name="height")) +
  theme_classic() +
  theme(axis.text.y.right=element_text(colour="red"),
        axis.text.y=element_text(colour="blue"),
        axis.title.y.right=element_text(colour="red"),
        axis.title.y=element_text(colour="blue"))

这对我来说似乎更直观,特别是如果每​​个人的测量值(隐式)按时间排序:

ggplot(dat, aes(weight, height, label=person, group=person)) +
  geom_line(colour="grey70") +
  geom_text()

【讨论】:

  • 我认为这很好地说明了为什么不鼓励辅助轴上的自变量:)
  • 是的,我非常同意!
  • 这真的很有帮助。在您的第一个代码中,如果您只添加 facet_wrap(~set) 它就可以解决问题并将其分成块。
  • 我同意不应该鼓励自变量。在我的真实数据中,我正在查看 x 轴上对象的不同位置。这是一种快速而肮脏的看待关系的方式,无需进行大量循环统计。
【解决方案2】:

根据 cmets,似乎真正的问题是如何使用 ggplot2 实现适当的绘图,而不是如何强制 plotrix 做它不能做的事情。

ggplot2 中不鼓励使用辅助轴,因为它们具有误导性。眼睛很容易比较无法比较的值,尤其是在线条交叉的地方。因此,sec_axis 仅限于一个变量是另一个变量的直接转换的情况。

我认为最好使用高度和重量作为刻面,并按组设置颜色。这将清楚地显示每个变量、每个人、每个集合中的变化(我假设这类似于时间点)。关键是要考虑您要突出显示数据集的哪些方面并相应地创建图表。

举几个例子。首先,按身高/体重,按组颜色:

library(tidyr)
library(ggplot2)
dat %>% 
  gather(var, value, -(1:2)) %>% 
  ggplot(aes(person, value)) + 
    geom_point(aes(color = factor(set))) + 
    facet_wrap(~var, scales = "free_y")

或按人着色,绘制集与每个变量。在这种情况下,我很想使用线条:

dat %>% 
  gather(var, value, -(1:2)) %>% 
  ggplot(aes(factor(set), value)) + 
    geom_line(aes(color = person, group = person)) + 
    facet_wrap(~var, scales = "free_y")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    相关资源
    最近更新 更多