【问题标题】:How can I indicate negative values in different colour in shiny with ggplot?如何用 ggplot 在闪亮的不同颜色中指示负值?
【发布时间】:2016-01-17 21:54:07
【问题描述】:

我想显示包含负值的数据框图。在这种情况下,负值可以用红线表示。然而我没能成功。当尝试绘制绘图时,由于 cbind 参数,负值开始遵循顺序。另外,我不知道另一种组合数据框的方法。

set.seed(123)
tmp <- data.frame(time = 1:10, quantity = round(runif(10, -15, 25)) )

neg <- tmp$quantity[tmp$quantity <0]
tmp.pred <-  cbind(tmp,neg)

y <- ggplot(tmp, aes(time, quantity)) + 
 geom_line() +   
 geom_line(data=tmp.pred, aes(y=neg),color="red") 
 y

【问题讨论】:

  • 你的代码给了我一个错误,你不明白吗?
  • 应该安装ggp​​lot2包。
  • @rawr 是对的,您的代码有问题。一方面 tmp1
  • 使用干净的 r 会话重新启动并仅尝试您问题中的代码
  • neg 不是data.frame,它没有正确的“行数”

标签: r plot ggplot2 shiny


【解决方案1】:

我认为有几种方法可以让你接近你所追求的。

library(ggplot2)

set.seed(123)
tmp <- data.frame(time = 1:10, quantity = round(runif(10, -15, 25)) )

方法 1 - 按表达式着色

这将从数量为负数的点开始为线着色,直到数量再次为非负数。

ggplot(tmp, aes(time, quantity, colour=(quantity <= 0))) + 
geom_line(aes(group=1))

方法 2 - 添加一个额外的列,这样我们就可以为两条线着色,一个是完整的“数量”列,另一个是只有负数的那些值,或者任何大小的消极的。 (否则它们将是 NA)

library(dplyr)
tmp <- tmp %>%
    mutate(neg = ifelse(quantity <= 0, quantity, NA)) %>%
    mutate(neg = ifelse(is.na(neg) & lag(neg) <= 0, quantity, neg)) %>%
    mutate(neg = ifelse(is.na(neg) & lead(neg) <= 0, quantity, neg))

ggplot() +
    geom_line(data=tmp, aes(x=time, y=quantity) , colour="black") +
    geom_line(data=tmp, aes(x=time, y=neg), colour="red")

如果您希望它只在线穿过x==0 线时改变颜色,您可能需要对数据进行更多操作

【讨论】:

    【解决方案2】:

    这是你想要的吗?

    library(ggplot2)
    set.seed(1)
    tmp <- data.frame(time = 1:10, quantity = round(runif(10, -15, 25)) )
    tmp$series <- ifelse(tmp$quantity < 0, "Negative", "Positive")
    y <- ggplot(tmp, aes(x = time, y = quantity, colour = series)) + 
      geom_line() +
      scale_colour_manual(values=c("red", "blue"))
    y
    

    【讨论】:

    • 说实话,这并不是我想要的。我不想看到负值的另一行。当 tmp 的值小于零时,应更改线条颜色以“警告”或引起用户注意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2018-03-04
    • 2015-09-27
    • 1970-01-01
    • 2020-02-23
    • 2014-08-23
    相关资源
    最近更新 更多