[英]Secondary axis in R not registering
ggplot(df) +
geom_bar(aes(x=Date, y=DCMTotalCV, fill=CampaignName), stat='identity', position='stack') +
geom_line(aes(x=Date, y=DCMCPA, color=CampaignName, group=as.factor(CampaignName)), na.rm = FALSE,show.legend=NA)+
scale_y_continuous(sec.axis = sec_axis(~./1000, name = "DCMTotalCV"))+
theme_bw()+
labs(
x= "Date",
y= "CPA",
title = "Daily Performance"
)
大家好 - 所以我有 2 个 y 轴我想绘制。 geom_line 在主 y 轴上注册得很好,但 geom_bar 在右侧没有正确注册。 我尝试缩放,但它仍然没有在第二个轴上注册或绘图。 看起来它仍然出现在主 y 轴上,所以我想知道如何告诉情节在第二个轴上绘制它? 对不起,我是个新手。 谢谢!
data <- data.frame(
day = as.Date("2020-01-01"),
conversions = seq(1,6)^2,
cpa = 100000 / seq(1,6)^2
)
head(data)
str(data)
#plot
ggplot(data, aes(x=day)) +
geom_bar( aes(y=conversions), stat='identity') +
geom_line( aes(y=cpa)) +
scale_y_continuous(sec.axis = sec_axis(~./1000))
ggplot2::sec_axis
仅用于放置比例尺本身; 尝试缩放值(您与该轴配对)没有任何作用。 为什么? 主要是因为它不知道您打算将哪个y
变量与哪个 y 轴配对。 (在sec_axis
是否有任何地方告诉它应该查看特定变量?没有。)
作为演示,让我们从一些随机数据开始并绘制线条。
set.seed(42)
dat <- data.frame(x = rep(1:10), y1 = sample(10), y2 = sample(100, size = 10))
dat
# x y1 y2
# 1 1 1 47
# 2 2 5 24
# 3 3 10 71
# 4 4 8 89
# 5 5 2 37
# 6 6 4 20
# 7 7 6 26
# 8 8 9 3
# 9 9 7 41
# 10 10 3 97
ggplot(dat, aes(x, y1)) +
geom_line() +
scale_y_continuous(name = "Oops!")
现在您确定要在其中添加y2
变量,但由于其值的比例完全不同,您认为只需添加它们(我将在此处使用geom_text
),然后设置第二个轴。
ggplot(dat, aes(x, y1)) +
geom_line() +
geom_text(aes(y = y2, label = y2)) +
scale_y_continuous(name = "Oops!", sec.axis = sec_axis(~ . * 10, name = "Quux!"))
这有两个错误:
y
值压缩到图的底部; 和y*
变量。 最后一点很重要:这给出了从 0 到 100 的y
值,因此轴将反映这一点。 你可以做lims(y=c(0,10))
,但意识到你会截断y2
值......这不是正确的方法。
相反,您需要将第二个值缩放到与主轴变量y1
相同的值范围内。 虽然不是必需的,但我会为此使用scale::rescale
。
dat$y2scaled <- scales::rescale(dat$y2, range(dat$y1))
dat
# x y1 y2 y2scaled
# 1 1 1 47 5.212766
# 2 2 5 24 3.010638
# 3 3 10 71 7.510638
# 4 4 8 89 9.234043
# 5 5 2 37 4.255319
# 6 6 4 20 2.627660
# 7 7 6 26 3.202128
# 8 8 9 3 1.000000
# 9 9 7 41 4.638298
# 10 10 3 97 10.000000
请注意y2scaled
现在如何按比例在y1
的范围内?
我们将使用它来定位每个文本对象(尽管我们仍将在此处将y2
显示为标签)。
ggplot(dat, aes(x, y1)) +
geom_line() +
geom_text(aes(y = y2scaled, label = y2)) +
scale_y_continuous(name = "Oops!", sec.axis = sec_axis(~ . * 10, name = "Quux!"))
我们是否严格要求确保与辅助轴配对的点完全填充主轴的值范围? 不。我们很容易想到只在图的下半部分保留文本标签,所以我们必须适当地缩放。
dat$y2scaled2 <- scales::rescale(dat$y2, range(dat$y1) / c(1, 2))
dat
# x y1 y2 y2scaled y2scaled2
# 1 1 1 47 5.212766 2.872340
# 2 2 5 24 3.010638 1.893617
# 3 3 10 71 7.510638 3.893617
# 4 4 8 89 9.234043 4.659574
# 5 5 2 37 4.255319 2.446809
# 6 6 4 20 2.627660 1.723404
# 7 7 6 26 3.202128 1.978723
# 8 8 9 3 1.000000 1.000000
# 9 9 7 41 4.638298 2.617021
# 10 10 3 97 10.000000 5.000000
ggplot(dat, aes(x, y1)) +
geom_line() +
geom_text(aes(y = y2scaled2, label = y2)) +
scale_y_continuous(name = "Oops!", sec.axis = sec_axis(~ . * 20, name = "Quux!"))
请注意,我不仅更改了 y 轴值的缩放方式(现在y2scaled2
范围从 0 到 5),而且我还必须将sec_axis
内的转换更改为*20
而不是*10
。
有时,正确地进行这些转换可能会令人困惑,而且很容易弄乱它们。 然而……意识到甚至将这个功能引入ggplot2
需要很多年,主要是由于主要开发人员认为即使绘制得很好,它们也会让观众感到困惑,并可能提供误导性的结论。 我发现它们有时很有用,并且可以使用一些技巧来鼓励正确的解释,但是......很难获得,因为很容易出错。
作为一种有助于区分哪个轴与哪个数据对应的技术的示例,请参见:
ggplot(dat, aes(x, y1)) +
geom_line(color = "blue") +
geom_text(aes(y = y2scaled2, label = y2), color = "red") +
scale_y_continuous(name = "Oops!", sec.axis = sec_axis(~ . * 20, name = "Quux!")) +
theme(
axis.ticks.y.left = element_line(color = "blue"),
axis.text.y.left = element_text(color = "blue"),
axis.title.y.left = element_text(color = "blue"),
axis.ticks.y.right = element_line(color = "red"),
axis.text.y.right = element_text(color = "red"),
axis.title.y.right = element_text(color = "red")
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.