这是前一个问题的延伸:
Assign colors to a data frame based on shared values with a character string in R
我现在有一个包含x
,y
,errrs
和newcolors
的数据框,我想使用ggplot2按颜色绘制数据和误差线。我试过这个,情节很好,但颜色甚至都不正确。我已经尝试在ggplot()
调用中的不同位置定义颜色变量,但没有运气。我错过了什么?
以下是数据:
names <- c( "TC3", "102", "172", "136", "142", "143", "AC2G" )
colors <- c( "darkorange", "forestgreen", "darkolivegreen", "darkgreen", "darksalmon", "firebrick3", "firebrick1" )
dataA <- c( "JR13-101A", "TC3B", "JR12-136C", "AC2GA", "TC3A" )
newcolors <- rep( NA, length( dataA ) )
dataA <- as.data.frame( cbind( dataA, newcolors ) )
x <- c( 1, 2, 3, 4, 5 )
y <- c( 10, 6, 3, 18, 2 )
errs <- c( 2, 1, 2, 1, 2 )
dataA <- cbind( dataA, x, y, errs )
以及@ Dave2e之前的问题的解决方案,它按样本名称分配颜色:
dataA$newcolors <- as.character( dataA$newcolors )
for( j in 1:length( names ) ) {
dataA$newcolors[ grep( names[ j ], dataA$dataA ) ] <- colors[ j ]
}
最后我试过的绘图代码:
ggplot( dataA, aes( x = x, y = y) ) +
geom_errorbar( aes( ymin = y - errs, ymax = y + errs, color = newcolors ),
width = 0.03 ) +
geom_point( size = 5, aes( color = newcolors) )
(我也尝试通过aes()
将颜色放入aes( x = x, y = y, color = newcolors
前调用。除了颜色不正确之外,情节看起来还不错。 "darkorange"
显示为浅绿色"darkgreen"
呈粉红色,"firebrick1"
为浅蓝色。
答案 0 :(得分:2)
在回应OP的this comment时,您可以尝试
ggplot(dataA, aes(x = x, y = y, fill = I(newcolors))) +
geom_errorbar(aes(ymin = y - errs, ymax = y + errs),
width = 0.03) +
geom_point(size = 5, shape = 21)
在geom_point()
尺寸,形状和边框颜色已经明确定义,即在aes()
的调用之外。填充编号为21到24的形状(有关可用形状,请参阅http://ggplot2.tidyverse.org/reference/scale_shape.html)。因此,在fill
的调用中定义了color
美学而非aes()
美学。因此,默认情况下,错误栏和符号边框将以黑色打印。
可能的优点(或缺点)是已将NA
指定为newcolor
的数据点可见。
为了进行比较,下面是从Richard Telford's comment获取建议后情节的展示方式:
ggplot(dataA, aes(x = x, y = y, color = I(newcolors))) +
geom_errorbar(aes(ymin = y - errs, ymax = y + errs),
width = 0.03) +
geom_point(size = 5)
请注意,ggplot2
删除了最左边的数据点,因为没有分配给此数据点的颜色,即NA
。
警告信息:
删除了包含缺失值的1行(geom_point)。