2

我的数据如下所示:

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)

twoord.plot我正在尝试使用包中的函数绘制具有相同 x 轴(人)和 2 个不同 y 轴(体重和身高)的图形plotrix。但是,我不知道如何像 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() 中实现这一点的任何想法?

4

2 回答 2

2

我觉得这个情节真的很混乱,但这似乎或多或少是什么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()

在此处输入图像描述

于 2017-09-05T04:24:34.693 回答
0

根据评论,似乎真正的问题是如何使用 实现适当的情节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")

在此处输入图像描述

于 2017-09-05T04:24:21.357 回答