【问题标题】:bar and line plot in one chart with a legend under ggplot2一个图表中的条形图和折线图,在 ggplot2 下带有图例
【发布时间】:2012-09-06 14:11:13
【问题描述】:

我想将两个独立但相关的系列的条形图和折线图放在同一张图表上,并带有图例(条形图按季度增长,折线图按年增长)。

我目前使用宽格式的 data.frame 和这样的代码:

p <- ggplot() +
    geom_bar(df, aes(x=Date, y=quarterly), colour='blue') +
    geom_line(df, aes(x=Date, y=annual), colour='red')

但我不知道如何添加一个图例,它有一条标有“年度增长”的红线;和一个标有“季度增长”的蓝色方块。

另外,我不知道如何使用长格式 data.frame 为不同系列设置不同的几何图形。

更新:

下面的示例代码让我部分了解了解决方案,但有一个非常丑陋的重复图例。仍在寻找完整的解决方案...这种方法基于将数据放在长格式中,然后绘制数据的子集...

library(ggplot2)
library(reshape)
library(plyr)
library(scales)

### --- make a fake data set
x <- rep(as.Date('2012-01-01'), 24) + (1:24)*30
ybar <- 1:24
yline <- ybar + 1

df <- data.frame(x=x, ybar=ybar, yline=yline)
molten <- melt(df, id.vars='x', measure.vars=c('ybar', 'yline'))
molten$line <- ifelse(molten$variable=='yline', TRUE, FALSE)
molten$bar <- ifelse(molten$variable=='ybar', TRUE, FALSE)

### --- subset the data set
df.line  <- subset(molten, line==TRUE)
df.bar   <- subset(molten, bar==TRUE)

### --- plot it
p <- ggplot() +
geom_bar(data=df.bar, mapping=aes(x=x, y=value, fill=variable, colour=variable),
    stat='identity', position='dodge') +
geom_line(data=df.line, mapping=aes(x=x, y=value, colour=variable)) +

opts(title="Test Plot", legend.position="right") 

ggsave(p, width=5, height=3, filename='plot.png', dpi=150)

还有一个示例情节......

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    通过使用 geoms 的 subset 参数。

    > x=1:10;df=data.frame(x=x,y=x+1,z=x+2)
    > ggplot(melt(df),
        aes(x,value,color=variable,fill=variable))+
      geom_bar(subset=.(variable=="y"),stat="identity")+
      geom_line(subset=.(variable=="z"))
    

    【讨论】:

    • subset 似乎不再在 ggplot 命令中工作——有解决办法吗?
    • 你能举个例子吗?
    • @alexBrown,当然——你的会产生错误Using as id variables Error in do.call("layer", list(mapping = mapping, data = data, stat = stat, : could not find function "."
    • 那里帮不了你 - '.'是ggplot2中的一个核心功能。请重新安装 ggplot2 或 google 看看它在当前版本中是否损坏。
    • 或者 require (package) plyr 也是如此,也许最近的包分离对用户隐藏了它。
    最近更新 更多