当数值小于零时,如何使线变为红色?当数值大于零时,如何使线变为绿色?

3

我希望在图表中,当线条低于0时为红色,高于0时为绿色。我尝试自己解决这个问题,但是代码给我整个星期五到星期六的颜色(因为它低于0),而我只需要这种颜色在y=0以下。

a<-structure(list(group = c("Total", "Total", "Total", "Total", 
"Total", "Total", "Total"), measure = c("sales", "sales", "sales", 
"sales", "sales", "sales", "sales"), day = structure(1:7, .Label = c("MONDAY", 
"TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY", "SATURDAY", "SUNDAY"
), class = "factor"), variable = structure(c(1L, 1L, 1L, 1L, 
1L, 1L, 1L), .Label = c("ALL", "DE", "BE", "NL", "AUS", "ES", 
"IT", "FR", "PO"), class = "factor"), value = c(2400000, 3750000, 
3400000, 3100000, 2300000, 3600000, 3100000), per_mtoday = c(2400000, 
2400000, 2400000, 2400000, 2400000, 2400000, 2400000), per_mtoday_perc = c(0, 
0.5625, 0.416666666666667, 0.291666666666667, -0.0416666666666667, 
0.5, 0.291666666666667), colour1 = c("green", "green", "green", 
"green", "red", "green", "green")), row.names = c(1L, 15L, 29L, 
43L, 57L, 71L, 85L), class = "data.frame")


ggplot(a, aes(x=day, y=per_mtoday_perc,fill = colour1, color= colour1,group = 1)) +  
  geom_line(lwd=1.5)+
  scale_y_continuous(labels = scales::percent)

你可能正在寻找 scale_colour_steps*。请参考 help("scale_colour_stepsn") 中的示例。 - Oliver
1
@Oliver 我认为这与之前的问题(直接)无关。事实上,简单使用 scale_color_manual 就足够了。问题在于楼主首先需要插值处理数值。 - Konrad Rudolph
1个回答

7

这里要做的正确方法是,如Konrad Rudolph所建议的那样,插值以找到y轴上的零交错点。由于正确地执行可能有些费力,因此可以使用ggforce::geom_link2()进行近似处理。该函数已经通过层的stat部分在xy坐标点之间进行了插值,因此我们可以使用after_stat()函数根据插值点的y值进行着色。

library(ggplot2)
library(ggforce)

ggplot(a, aes(x=day, y=per_mtoday_perc,fill = colour1, color= colour1,group = 1)) +  
  geom_link2(lwd=1.5,
             aes(colour = after_stat(y < 0)))+
  scale_colour_manual(
    values = c("limegreen", "red")
  ) +
  scale_y_continuous(labels = scales::percent)

enter image description here


非常聪明。我喜欢它! - Limey
谢谢,它正在工作。但是您知道是否有可能添加一个条形图,例如 geom_bar(aes(x=day, y=value,fill = variable, color=variable),stat="identity",position="dodge")) (或者使用 group=1 替换 fill = variable, color=variable)吗? - Priit Mets
唉,当然了,‘ggforce’这个包直接就能做到这一点。你发帖的时候,我还在费劲地手动使用‘tweenr’来实现同样的效果。 - Konrad Rudolph
@Priit Mets,是的,你可以这样做,但如果你有预定义的y值,最好使用geom_col()而不是geom_bar()。@Konrad Rudolph,我非常了解这种感觉!我之前曾经构建过一个统计模型,本应适用于这种情况,只需插值出精确的交叉点,但在离散的x轴上出现了一些问题 :( - teunbrand

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