如何在ggplot2 R中使用sec_axis()处理离散数据?

9

我有类似这样的离散数据:

height <- c(1,2,3,4,5,6,7,8)
weight <- c(100,200,300,400,500,600,700,800)
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)

我正在尝试绘制一个具有相同x轴(人)和2个不同y轴(体重和身高)的图表。我找到的所有示例都试图绘制辅助轴(sec_axis)或使用基础图绘制离散数据。 是否有一种简单的方法在ggplot2中使用sec_axis来处理离散数据? 编辑:评论中有人建议我尝试建议的回复。但是,现在我遇到了这个错误。
这是我的当前代码:
p1 <- ggplot(data = dat, aes(x = person, y = weight)) + 
  geom_point(color = "red") + facet_wrap(~set, scales="free") 
p2 <- p1 + scale_y_continuous("height",sec_axis(~.*1.2, name="height"))
p2

I get the error: Error in x < range[1] : 
  comparison (3) is possible only for atomic and list types

现在,我已经修改了这个示例,使其与发布的此示例相匹配。

p <- ggplot(dat, aes(x = person))
p <- p + geom_line(aes(y = height, colour = "Height"))

# adding the relative weight data, transformed to match roughly the range of the height
p <- p + geom_line(aes(y = weight/100, colour = "Weight"))

# now adding the secondary axis, following the example in the help file ?scale_y_continuous
# and, very important, reverting the above transformation
p <- p + scale_y_continuous(sec.axis = sec_axis(~.*100, name = "Relative weight [%]"))

# modifying colours and theme options
p <- p + scale_colour_manual(values = c("blue", "red"))
p <- p + labs(y = "Height [inches]",
              x = "Person",
              colour = "Parameter")
p <- p + theme(legend.position = c(0.8, 0.9))+ facet_wrap(~set, scales="free") 
p

我收到一个错误,上面写着

"geom_path: Each group consists of only one observation. Do you need to 
 adjust the group aesthetic?"

我得到了模板,但没有绘制任何点。

这些是连续数据(数字),不是离散的(类别)。 - Brian
我意识到我链接了错误的源代码。我已经更正了链接并更新了我的答案,如果我使用它。 - Share
在你的 sec_axis(...) 前面添加 sec.axis =。如果不显式命名参数,则默认为 scale_y_continuous() 中的第二个参数,而 breaks = sec_axis(~.*1.2, name="height") 会触发错误,因为它在上下文中没有意义。 - Z.Lin
像这样 p1 + scale_y_continuous("height", sec_axis(sec.axis= ~.*1.2, name="height"))?这会导致错误。 - Share
据我所知,ggplot2不支持独立的次要轴。所有次要轴都必须基于主轴的一对一转换。 - LVG77
我认为这在几年前是这样的情况,但现在他们似乎有了sec_axis,这对其他人来说似乎可以胜任。但我无法让它为我工作。 - Share
1个回答

0

如果没有明确指定参数名称,则 R 函数参数按位置传递。正如评论中 @Z.Lin 所提到的,您需要在 sec_axis 函数之前加上 sec.axis=,以表明您将此函数馈送到 scale_y_continuoussec.axis 参数中。如果不这样做,它将被馈送到 scale_y_continuous 的第二个参数中,默认情况下为 breaks=。因此,错误消息与您未为 breaks 参数提供可接受的数据类型有关:

p1 <- ggplot(data = dat, aes(x = person, y = weight)) + 
  geom_point(color = "red") + facet_wrap(~set, scales="free") 
p2 <- p1 + scale_y_continuous("weight", sec.axis = sec_axis(~.*1.2, name="height"))
p2

![enter image description here

scale_y_continuous的第一个参数(name=)用于第一个y轴比例尺,而sec.axis=参数用于第二个y轴比例尺。我将您的第一个y轴比例尺名称更改以进行修正。


但是这似乎没有绘制体重和身高。我需要将体重和身高都绘制在同一条x轴上。 - Share
@Ash 这只是标签没有正确指定。请查看我的编辑答案。 - acylam
不,我认为你没有理解我的观点。对于每个人,例如在Set1中,对于Jack,我应该看到两个点,一个对应他的身高(标记为红色),另一个对应他的体重(标记为黑色)。然而这里的图表只给出了一个点,也许是体重和身高之间的关系?这不是我想要的。 - Share
2
@Ash 我明白了,你实际上想在同一张图上有两个不同的 y 轴。在这种情况下,sec.axis 不是正确的解决方案,因为它只允许第二个轴是第一个轴的线性变换。我认为 ggplot2 没有好的解决方案,因为它的设计目的是防止数据被错误地呈现。请参见此讨论:https://dev59.com/V3A75IYBdhLWcg3wy8br - acylam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接