【发布时间】:2019-04-03 23:28:02
【问题描述】:
library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point(size=4)
假设你有上面的scatterplot。如何指定>= 25 mpg 点将被绘制red、between 20 and 25 green 和0-20 blue?
这可以通过ggplot 来完成吗?
【问题讨论】:
library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point(size=4)
假设你有上面的scatterplot。如何指定>= 25 mpg 点将被绘制red、between 20 and 25 green 和0-20 blue?
这可以通过ggplot 来完成吗?
【问题讨论】:
您可以分两步完成:
首先,您定义应该具有不同颜色的组;通过向数据框或aes 中添加另一列。我将在这里使用aes:
aes(wt, mpg, color = cut(mpg, breaks = c(0, 20, 25, Inf)))
其次,通过手动指定颜色或填充比例:
scale_color_manual(values = c('blue', 'green', 'red'),
limits = c('(0,20]', '(20,25]', '(25,Inf]'))
这指定使用哪些颜色 (values) 以及将它们分配给哪些标签 (limits);这些是cut生成的分组名称。
综合起来:
ggplot(mtcars) +
aes(wt, mpg, color = cut(mpg, breaks = c(0, 20, 25, Inf))) +
geom_point(size = 4) +
scale_color_manual(values = c('blue', 'green', 'red'),
limits = c('(0,20]', '(20,25]', '(25,Inf]'))
您可以通过将分组作为单独的列添加到数据中来改进图例标题,或者提供guides 函数调用:
guides(color = guide_legend(title = 'mpg range'))
【讨论】:
当然可以,尽管这种类型的工作可能最适合在ggplot() 之前使用您的数据框。你可以像这样使用ifelse():
library(ggplot2)
p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point(size = 4,
aes(color = ifelse(mpg > 25, "> 25",
ifelse(mpg > 20, "20-25", "< 20")))) +
scale_color_manual(values = c("> 25" = "red", "< 20" = "blue", "20-25" = "green"),
name = "MPG" )
您无需调用guides() 来创建标题,您可以将其传递给scale_color_manual() 中的name = .. 参数
【讨论】:
+ scale_colour_manual(values = c("red" = "red","blue" = "blue","green" = "green")) 以避免@KonradRudolph 提到的问题。此外,尝试将 color 变量创建为数据集列,以获得更好的图例/标题。