R图颜色不正确ggplot

R graph colors are not correct ggplot

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

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 <- 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"))

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

由于语法错误,您没有任何黑点。您缺少将 scale 添加到绘图中的 + 标志,因此您实际上使用分配给 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 的使用方式。数据不需要额外的列来描述图表,绘图代码更短更清晰,图例上的标签与数据框中的标签一样好。