ggplot2传奇着色

时间:2012-09-28 11:05:47

标签: r ggplot2

我有一个包含5列的文本表。我想在同一个图上绘制4个列作为单独的密度图。我可以实现如下: enter image description here

上述情节的代码:

library(ggplot2)
library(grid)

dat <- read.table(textConnection("
file        low        high       avg               lowest
102         4218.0     5437.0     4739.0            4723.0
103         4516.0     5765.0     5061.0            5036.0
104         4329.0     5554.0     4858.0            4838.0
107         4094.0     5261.0     4596.0            4578.0
108         4334.0     5569.0     4865.0            4846.0
109         4397.0     5596.0     4924.0            4896.0
110         4046.0     5257.0     4555.0            4547.0
"), header=TRUE)

x_low = dat$low
x_high = dat$high
x_avg = dat$avg
x_lowest = dat$lowest

plotter = ggplot() + geom_density(aes(x=x_low), colour="red", fill="red", alpha = .3, data=data.frame(dat$low))
plotter = plotter + geom_density(aes(x=x_high),colour="blue", fill="blue", alpha = .3, data=data.frame(dat$high))
plotter = plotter + geom_density(aes(x=x_avg), colour="green", fill="green", alpha = .3, data=data.frame(dat$avg))
plotter = plotter + geom_density(aes(x=x_lowest), colour="purple", fill="purple", alpha = .3, data=data.frame(dat$lowest))
plotter = plotter + xlim(c(2000,7000))
print(plotter)

我现在想在情节的一侧有一个传奇。根据我的理解,我需要将colour移到aes

的括号内

我这样做如下:

library(ggplot2)
library(grid)

dat <- read.table(textConnection("
file        low        high       avg               lowest
102         4218.0     5437.0     4739.0            4723.0
103         4516.0     5765.0     5061.0            5036.0
104         4329.0     5554.0     4858.0            4838.0
107         4094.0     5261.0     4596.0            4578.0
108         4334.0     5569.0     4865.0            4846.0
109         4397.0     5596.0     4924.0            4896.0
110         4046.0     5257.0     4555.0            4547.0
"), header=TRUE)

x_low = dat$low
x_high = dat$high
x_avg = dat$avg
x_lowest = dat$lowest

plotter = ggplot() + geom_density(aes(x=x_low, colour="red", fill="red"), alpha = .3, data=data.frame(dat$low))
plotter = plotter + geom_density(aes(x=x_high, colour="blue", fill="blue"), alpha = .3, data=data.frame(dat$high))
plotter = plotter + geom_density(aes(x=x_avg, colour="green", fill="green"), alpha = .3, data=data.frame(dat$avg))
plotter = plotter + geom_density(aes(x=x_lowest, colour="purple", fill="purple"), alpha = .3, data=data.frame(dat$lowest))

plotter = plotter + xlim(c(2000,7000))
print(plotter)

输出:

enter image description here

每个图的颜色现在都是错误的(与第一个图相比)以及图例中的标注。

我怎么能:

  1. 纠正着色
  2. 删除每个密度图的黑色轮廓
  3. 更正图例

2 个答案:

答案 0 :(得分:1)

如果您使用melt包中的reshape2重新整理数据,则可以简化此操作。我认为以下代码将为您提供正确的图例,您想要的填充颜色,并摆脱密度图的轮廓:

dat.m <- melt(dat, id="file")
ggplot(dat.m, aes(value, fill=variable)) + geom_density(alpha = .3, color=NA) + scale_fill_manual(values=c("red", "blue", "green", "purple"))

答案 1 :(得分:1)

Dan M.'s answer是惯用且最直接的方法,但我想展示另一种可能在某些情况下具有其地位的方法。您有colourfill刻度,其中包含应使用的颜色;您正在寻找的规模是身份比例。添加以下行:

plotter = plotter + scale_fill_identity("", 
  labels=c("red"="low", "blue"="high", "green"="avg", "purple"="lowest"),
  guide="legend") 
plotter = plotter + scale_colour_identity("",
  labels=c("red"="low", "blue"="high", "green"="avg", "purple"="lowest"),
  guide="legend")

""参数摆脱了图例标题(如果你想要那些东西,请替换它),labels给出每种颜色应该标记的内容。需要一个命名向量来确保颜色和标签之间的匹配是正确的(否则,标签必须按颜色按字母顺序给出)。 guide=TRUE画了一个传奇;默认情况下,标识比例没有图例。 enter image description here