【问题标题】:R graph colors are not correct ggplotR图形颜色不正确ggplot
【发布时间】:2025-12-02 05:40:01
【问题描述】:

我正在绘制折线图并突出显示一些点。这是我得到的错误的一个玩具示例:

library('ggplot2')
time <- as.POSIXct(c("2014-12-10 20:51:53.103","2014-12-10 20:56:54.204",
                     "2014-12-10 20:57:54.204"), tz= "GMT")
p <- c(49.32, 60,50)
s <- c("B","","S")
pointcolor <- c("green","","red")
share <- c(35,0,6)
pointsize <- c(10,10,10)
shapeType <- c(16,10,16)
bigDF <- data.frame(time=time, p=p, s=s, pointcolor=pointcolor, share=share,
                    pointsize=pointsize, shapeType=shapeType)
bigDF
ggplot(bigDF, aes(x=time, y=p)) + geom_line() + 
  geom_point( aes(shape = as.factor(shapeType), 
                  size = pointsize, color = pointcolor))
scale_color_manual(values = levels(as.factor(bigDF$pointcolor)))
scale_size_manual(values = levels(as.factor(bigDF$pointsize)))

当你运行它时,你会得到一个如下所示的图表:

我正在尝试将第一个点涂成绿色,第二个点应该是黑色,第三个点应该是红色。但是你可以看到第二个点是红色的,第三个点是蓝色的而不是红色的。

我有一些问题:

为什么第二点红色不是黑色?

为什么第三个点蓝色不是红色?

为什么pointcolor图例显示一个红点而没有描述?

谢谢。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您正在尝试将 ggplot 用作基本图形。通常,数据集没有文字“颜色”列,这就是为什么将列映射到“颜色”(aes(color = column)) 与选择要使用的颜色 (scale_color_*()) 分开的原因。

    由于语法错误,您没有任何黑点。您缺少 + 符号以将您的 scales 添加到绘图中,因此您实际上使用默认字母顺序分配给您的 pointcolor 因子的默认 ggplot 颜色(红色、绿色蓝色、3 个级别),首先是"",然后是"green",然后是"red"

    通过输入+ 来修复该错误是不够的,因为"" 不是颜色。我认为您要求的是这样的:

    bigDF$pointcolor = factor(ifelse(bigDF$pointcolor == "", "black", bigDF$pointcolor))
    ggplot(bigDF, aes(x=time, y=p)) + geom_line() + 
    geom_point( aes(shape = as.factor(shapeType), 
                    size = pointsize,
                    color = pointcolor)) +
    scale_color_manual(values = levels(bigDF$pointcolor))
    

    但是你应该做的是在你的数据中有一个有意义的列,然后在比例函数中定义它的比例,而不是尝试编码将您的色标添加到您的数据中。

    有意义的栏目:

    有意义的数据列是指那些实际上是数据的列。我不确定您的数据究竟是什么,但我认为您的有意义的列是timepsshare

    您没有指定,看起来您的颜色是基于您的变量s,并且(更大的猜测)形状是您的变量share 是否为0。这应该绘制成这样:

    dd <- data.frame(time=time, p=p, s=s, share=share)
    ggplot(dd, aes(x = time, y = p)) +
        geom_line() +
        geom_point(aes(color = s, shape = share > 0), size = 10) +
        scale_color_manual(values = c("black", "green", "red")) +
        scale_shape_manual(values = c(16, 10))
    

    请注意,数据框更简单,没有颜色或形状,因为这些不是您的数据aes() 函数负责将数据映射到颜色和形状,scale 函数确定结果采用的值。请注意,默认图例标签现在很有用!

    这就是 ggplot 的使用方式。数据不需要额外的列来描述图表,图表的代码更短更清晰,图例上的标签与数据框中的标签一样好。

    【讨论】:

    • 感谢您的回答。能问下有意义是什么意思吗?我的数据中有点大小、点颜色、形状类型的列。我用它们来显示大小、颜色、形状等。这些不是你说的有意义的列吗?另外,你会说 scale_color 在这里是必要的,因为我想指定要使用的颜色吗?
    • 查看编辑,添加了一个新部分。 scale 函数会覆盖默认值,如果您对默认值感到满意,可以将它们排除在外。
    【解决方案2】:

    您需要实际指定黑色是黑色而不是""。您可以保留使用pointcolor &lt;- c("green","black","red") 构建的DF。这只是简化了输入。

    library(ggplot2)
    ggplot(bigDF, aes(x=time, y=p)) + geom_line() + 
      geom_point( aes(shape = as.factor(shapeType),size = pointsize, 
                      colour = c("green","black","red"))) +
      scale_color_manual(values = c("green","black","red"))
    

    【讨论】:

    • 嗨@ALEX - 我做了那个改变,但是当我重新运行时,第一个点是黑色的,第二个点是绿色的。应该是相反的。此外,pointcolor 的刻度显示为黑色,但颜色为绿色,当显示为绿色时为黑色。知道如何解决吗?谢谢。