当值低于零时,我希望我的条形变为红色。这不是我正在使用的实际数据,但我希望这将创建一个可重现的示例:
library(ggplot2)
library(car)
mtcars$carnames <- rownames(mtcars)
rownames(mtcars) <- 1:nrow(mtcars)
subsetCars <- as.data.frame(head(mtcars, n = 20))
subsetCars[1,4] <- -50
myplot.p <- ggplot(subsetCars, aes(x = subsetCars$carnames, y = subsetCars$hp))
myplot.p + geom_bar(stat = 'identity',
fill = ifelse(subsetCars$hp > 0, "lightblue", "firebrick")) +
coord_flip()
一个条形图为红色,但不是具有负值的条形图形。我当前正在处理的问题上也有类似的问题。 建议?
答案 0 :(得分:2)
请注意fill
中的geom_bar
参数采用由ifelse
创建的向量,其中第一个元素为&#34; firebrick&#34;所有其他元素都是&#34; lightblue&#34;。因此,第一个(最底部)栏将填充红色。但是,第一个栏与具有负值的行不对应,因为观察已按字母顺序由carnames
重新排序。
用于绘制所需图表的更为惯用的方法是
myplot.p <- ggplot(subsetCars, aes(x = carnames, y = hp, fill = hp < 0))
myplot.p + geom_bar(stat = 'identity') +
scale_fill_manual("Negative hp", values = c("lightblue", "firebrick")) +
coord_flip()
其中$
子集是不必要的,正如@alistaire指出的那样,fill
审美可以在ggplot()
中说明。
答案 1 :(得分:0)
您遇到的问题是,当您指定填充时,ggplot不会按照与名称相同的顺序分配该美学。因此,为了确保订单得到保留,您需要将大于零的变量与其他美学结合起来。
这种不幸的副作用是您需要手动设置颜色并删除填充比例图例。
ggplot(subsetCars, aes(x = subsetCars$carnames, y = subsetCars$hp,
fill = hp > 0)) +
geom_bar(stat = 'identity') +
coord_flip() +
scale_fill_manual(values = c("TRUE" = "lightblue",
"FALSE" = "firebrick")) +
theme(legend.position = "none")
我希望有所帮助!