我有一个包含5列的文本表。我想在同一个图上绘制4个列作为单独的密度图。我可以实现如下:
上述情节的代码:
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)
输出:
每个图的颜色现在都是错误的(与第一个图相比)以及图例中的标注。
我怎么能:
答案 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是惯用且最直接的方法,但我想展示另一种可能在某些情况下具有其地位的方法。您有colour
和fill
刻度,其中包含应使用的颜色;您正在寻找的规模是身份比例。添加以下行:
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
画了一个传奇;默认情况下,标识比例没有图例。