ggplot2副轴奇怪的输出
Posted
技术标签:
【中文标题】ggplot2副轴奇怪的输出【英文标题】:ggplot2 secondary axis strange output 【发布时间】:2018-03-01 19:57:09 【问题描述】:我正在尝试两个用 ggplot2 制作双 y 轴图。但是,主 y 轴文本值已更改(和限制),并且其中一个变量显示错误(“均值”变量)。 编辑:“均值”变量的文本标签范围从 0.55 到 0.75,因此很难看到变量。但是,在该图的原始步骤中 (p )它的范围从 0.7757 到 0.7744。它应该显示为原始步骤(也许它必须与 ggplot 调用中的数据操作有关?)此外,是否可以将轴 y1 文本与要显示的轴 y2 文本协调同一水平线?
# dput(coeff.mean)
coeff.mean <- structure(list(individuals = c(5L, 18L, 31L, 43L, 56L, 69L, 82L,
95L, 108L, 120L, 133L, 146L, 159L, 172L, 185L, 197L, 210L, 223L,
236L, 249L, 262L, 274L, 287L, 300L, 313L, 326L, 339L, 351L, 364L,
377L), mean_d = c(0.775414405190575, 0.774478867355839, 0.774632679560057,
0.774612015422181, 0.774440717600404, 0.774503749029999, 0.774543337328481,
0.774536584528457, 0.774518615875444, 0.774572944896752, 0.774553554507719,
0.774526346948343, 0.774537645238366, 0.774549039219398, 0.774518593880137,
0.77452848368359, 0.774502654364311, 0.774527249259969, 0.774551190425812,
0.774524221826879, 0.774514765537317, 0.774541221078135, 0.774552621147008,
0.774546365564095, 0.774540310535789, 0.774540468208943, 0.774548658706833,
0.77454534219406, 0.774541081476004, 0.774541996470423), var_d = c(0.000438374265308954,
0.000345714068446388, 0.000324909665783972, 0.000318897997146887,
0.000316077108040133, 0.000314032075708385, 0.000310447758209298,
0.000310325171003455, 0.000311927176741998, 0.000309622062319051,
0.000308772480851544, 0.000308388263293765, 0.000306838067001956,
0.000307838047303517, 0.000307737478217495, 0.000306351076037266,
0.000307288393036824, 0.000306717640522594, 0.000306768886331324,
0.000306897320278579, 0.000307154374510682, 0.000306352361061403,
0.000306998606721366, 0.000306434828650204, 0.000305865398401208,
0.000306061994682725, 0.000305934443005304, 0.000305853730364841,
0.000306181262913308, 0.000306820996289535)), .Names = c("individuals",
"mean_d", "var_d"), row.names = c(NA, -30L), class = c("tbl_df",
"tbl", "data.frame"))
p <- ggplot(coeff.mean, aes(x=individuals))
p <- p + geom_line(aes(y = mean_d, colour = "mean")) + geom_point(aes(y = mean_d, colour = "mean"))
p <- p + geom_line(aes(y = var_d*(max(mean_d)/max(var_d)), colour = "var")) + geom_point(aes(y = var_d*(max(mean_d)/max(var_d)), colour = "var"))
p <- p + scale_y_continuous(sec.axis = sec_axis(~.*(max(coeff.mean$var_d)/max(coeff.mean$mean_d)), name = "var"))
p <- p + scale_colour_manual(values = c("black", "grey"))
p <- p + labs(y = "mean", x = "Resampled", colour = "Statistic")
print(p)
我非常感谢任何建议。
【问题讨论】:
我认为您需要更具体地了解情节的问题。 y 轴值应该是多少?哪个变量显示错误?应该如何显示? @bdemarest 我已经编辑了这个问题。提前致谢。 需要重新调整一个或两个或您的 y 变量,以便在单个图上显示mean
和 var
的全部范围。但随后显示的 y 轴值将是缩放值。因此,您必须手动设置 y 轴中断和值以显示原始值。 ggplot 不会自动进行这些调整,部分原因是作者不鼓励双轴绘图。
@bdemarest 感谢您的评论。我会尽力按照你说的去做。老实说,我也不喜欢使用这种绘图,但是在这种特殊情况下(考虑到我想以这种方式绘制多个参数)最好使用 5 个绘图而不是 10 个绘图。
你的问题是你的方差不是乘法的,而是加法的。每个值的范围都很窄(+/- 0.0001),所以乘以你的方差将使你的平均值的分布相形见绌。
【参考方案1】:
在这里,我展示了使用构面作为双轴图的替代方案。我知道它没有回答原来的问题,对不起!
library(ggplot2)
library(tidyr)
# Convert data to long form with tidyr::gather()
long_dat = gather(data=coeff.mean, key="stat", value="stat_value", mean_d, var_d)
head(long_dat)
# A tibble: 6 x 3
# individuals stat stat_value
# <int> <chr> <dbl>
# 1 5 mean_d 0.7754144
# 2 18 mean_d 0.7744789
# 3 31 mean_d 0.7746327
# 4 43 mean_d 0.7746120
# 5 56 mean_d 0.7744407
# 6 69 mean_d 0.7745037
p2 = ggplot(long_dat, aes(x=individuals, y=stat_value, colour=stat)) +
geom_point() +
geom_line() +
scale_colour_manual(values=c(mean_d="black", var_d="grey40")) +
facet_grid(stat ~ ., scales="free_y")
ggsave("faceted_plot.png", plot=p2, height=4, width=6, dpi=150)
【讨论】:
【参考方案2】:这更清楚地表明了我的评论所指出的:您不需要乘法缩放 var_d,您需要添加它。
library(dplyr)
coeff.mean %>%
ggplot(aes(individuals, mean_d)) +
geom_point(aes(color = "mean_d")) + geom_line(aes(color = "mean_d")) +
geom_point(aes(individuals, var_d+0.7745, color = "var_d")) +
geom_line(aes(individuals, var_d+0.7745, color = "var_d")) +
scale_y_continuous(sec.axis = sec_axis(trans = ~ . - 0.7745))
当然,由于各种原因,这个数字是有问题的。很难确定。
如果您想同时进行乘法和加法缩放,您可以尝试scales::rescale
,一次将 var_d 缩放到 mean_d 的范围,然后再次缩放将 var_d 缩放回原始范围。
coeff.mean %>%
mutate(var_rescaled = scales::rescale(var_d, to = range(mean_d))) %>%
ggplot(aes(individuals, mean_d)) +
geom_point(aes(color = "mean_d")) + geom_line(aes(color = "mean_d")) +
geom_point(aes(y = var_rescaled, color = "var_d")) +
geom_line(aes(y = var_rescaled, color = "var_d")) +
scale_y_continuous(sec.axis =
sec_axis(trans = ~scales::rescale(., to = range(coeff.mean$var_d)),
breaks = function(values) scales::pretty_breaks(n=5)(values),
name = "var_d"))
这个也有问题。特别是,由于 mean_d 和 var_d 的最高值在同一个 individual,因此它们在该点重叠。
【讨论】:
以上是关于ggplot2副轴奇怪的输出的主要内容,如果未能解决你的问题,请参考以下文章
用ggplot2画箱线图叠加图层后变成一个很奇怪的样子,求救求救?
R语言ggplot2可视化:将dataframe和数据列名称传递给函数通过函数进行ggplot2可视化输出
为啥 tiff 输出看起来与 R studio 中的 ggplot2 输出不同?