【问题标题】:How to limit the scale of secondary y-axis in a range in ggplot R?如何在ggplot R的范围内限制辅助y轴的比例?
【发布时间】:2019-08-14 06:37:03
【问题描述】:

我想将次轴从 0 固定到 1,因为概率始终在 0 到 1 的范围内。但是,根据数据,如果最大回报 (y) 很高(如下图所示, 6%),那么次y轴的比例会超过1(因为它依赖于主y轴),这不是一个理想的演示情况。我应该如何限制辅助 y 轴的最大比例?

我听说ggplot 仍然不允许我们限制辅助轴的比例,但我不确定是否正确。是否有任何其他方法可以限制辅助 y 轴的比例,以便图表上显示的最大概率始终为 1 或小于 1,这取决于最大回报。请注意,代码中显示的 y 是返回值。

y <- c(0.01, -0.005, 0.06)
Month <- c("Jan", "Feb", "Mar")

dtf <- data.frame(Month, y)

require(reshape)
dtf2 <- melt(dtf)
dtf2[["sign"]] = ifelse(dtf2[["value"]] >= 0, "positive", "negative")
Probability <- c(0.4,0.22,0.54)

dtf2 <- data.frame(dtf2, Probability)

dtf2 %>>% ggplot() + 
  geom_bar(mapping = aes(x=Month, y=value, fill = sign), stat ="identity", width = 0.75)+
  geom_point(mapping = aes(x=Month, y=Probability/20-0.025), size = 2.5, color="blue")+
  geom_line(mapping = aes(x=Month, y=Probability/20-0.025, group = 1), color = "blue", size = 1)+
  geom_hline(yintercept=0)+
  geom_text(aes(x=Month, y=value, label = paste(y * 100,"%"), vjust = ifelse(y >= 0, -0.5, 1.2)), hjust = 0.5)+
  ylab("\nReturn")+
  theme(axis.text.x = element_text(face = "bold", size=11),
        axis.text.y = element_text(face = "bold"),
        axis.title.x=element_blank(),
        legend.position = "none",
        plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))+
  theme(panel.background = element_blank(),
        axis.ticks.x = element_blank()) +
  theme(axis.line.y = element_line(color="black", size = 0.5))+
  scale_y_continuous(labels=scales::percent, sec.axis = sec_axis(~(. + 0.025)*20, name = "Probability\n" ))+
  scale_fill_manual(values = c("positive" = "black", "negative" = "red"))

如果回报较低,我希望辅助 y 轴的最大比例始终为 1 或小于 1。请给点建议,谢谢!

【问题讨论】:

  • 这种图正是ggplot2中副轴如此困难的原因。哈德利(正确地)不想支持这一点。
  • 你有什么建议我应该如何通过使用 R 中的其他函数而不是 gglot 来准确地绘制这个图?
  • 我个人的看法是你不应该创建这个图表。因此,我不会努力向您展示如何使用基本图形来做到这一点。也许其他人会愿意。
  • 我完全同意@Roland。也许可以进一步说明这一点:假设如何解释 6% 超过概率尺度上的 100% 的条形图?左标尺和右标尺之间究竟有什么联系?读者如何知道何时选择哪个比例?我建议看看这里:stackoverflow.com/a/3101876/5892059
  • 正确比例显示的概率实际上是获得正回报的概率。所以在这种情况下,3月份得到正回报的概率是0.54,2月份得到正回报的概率是0.4。情节是客户要求的,他们想让我把两个情节结合起来,所以我别无选择。当然,实际数据不是这样的,所以可能没有意义。如果有任何建议将不胜感激

标签: r ggplot2 limit yaxis


【解决方案1】:
library(tidyverse)
library(rashape2)
y <- c(0.01, -0.05, 0.06)
Month <- c("Jan", "Feb", "Mar")
dtf <- data.frame(Month, y) 
require(reshape)
dtf2 <- melt(dtf)
dtf2[["sign"]] = ifelse(dtf2[["value"]] >= 0, "positive", "negative")
Probability <- c(0.4,0.22,0.54)
yrange <-max(y)- min(y) 
ymin <- min(y)
dtf2 <- data.frame(dtf2, Probability) 

dtf2 %>%  ggplot() + 
  geom_bar(mapping = aes(x=Month, y=value, fill = sign), stat ="identity", width  = 0.75)+
  geom_point(mapping = aes(x=Month, y=Probability*yrange+ymin), size = 2.5,  color="blue") +
  geom_line(mapping = aes(x=Month, y=Probability*yrange+ymin, group = 1), color = "blue", size = 1)+
  geom_hline(yintercept=0)+
  geom_text(aes(x=Month, y=value, label = paste(y * 100,"%"), vjust = ifelse(y >= 0, -0.5, 1.2)), hjust = 0.5)+
  ylab("\nReturn")+
  theme(axis.text.x = element_text(face = "bold", size=11), axis.text.y = element_text(face = "bold"),
    axis.title.x=element_blank(),
    legend.position = "none",
    plot.title = element_text(hjust = 0.5),
    plot.subtitle = element_text(hjust = 0.5))+
  theme(panel.background = element_blank(),
    axis.ticks.x = element_blank()) +
  theme(axis.line.y = element_line(color="black", size = 0.5))+
  scale_y_continuous(labels=scales::percent, sec.axis = sec_axis(~(. -ymin)/yrange, name = "Probability\n", breaks = c(0,0.5,1)))+
  scale_fill_manual(values = c("positive" = "black", "negative" = "red"))

【讨论】:

  • 您好,王志强,感谢您的回复。我已经尝试过您修改过的代码,是的,它可以使概率从 0 到 1。但是,如果有一个非常负的回报,例如-5%,概率的比例也会为负。我应该使用不同的数据集,因此预期的输出会更加灵活。
  • 感谢志强,它非常适合我!谢谢你的帮助! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-05
  • 2015-03-27
相关资源
最近更新 更多