首页 文章

使用aes_string时ggplot2中两个geom_point()的颜色

提问于
浏览
4

我想从数据框中生成两个系列“Pos”和“Neg”(y值)的图 . x值位于“平均值”列中 . 我希望这个系列有不同的颜色 .

搜索stackoverflow给了我一个类似的问题:change color for two geom_point() in ggplot2,但我想使用aes_string以便在检查包时避免注释 .

我使用aes和'自动'颜色让它工作,如下面的第一个例子 . 但是,我无法弄清楚如何使用aes_string生成相同的绘图,仍然让ggplot决定颜色 . 我觉得这应该是一件简单的事......

一个可重复的例子:

exData <- data.frame(Marker = rep("TH01", 10),
                 Mean = seq(1:10),
                 Neg = -1*runif(10,0.1,1),
                 Pos = runif(10,0.1,1))

# Produce the correct plot, with 'automatic' colours.
gp <- ggplot(exData, aes_string(x="Mean"),
             shape=val_shape, alpha=val_alpha)
gp <- gp + geom_point(aes(y=Pos, colour="Max"))
gp <- gp + geom_point(aes(y=Neg, colour="Min"))
gp <- gp + scale_colour_discrete(name = "Legend")
print(gp)

# Produce the correct plot, but not with 'automatic' colours.
gp <- ggplot(exData, aes_string(x="Mean"),
             shape=val_shape, alpha=val_alpha)
gp <- gp + geom_point(aes_string(y="Pos"), colour=1)
gp <- gp + geom_point(aes_string(y="Neg"), colour=2)
gp <- gp + scale_colour_discrete(name = "Legend")
print(gp)

2 回答

  • 0

    格式化数据的方式不适合 ggplot2 . 首先将其转换为"long"格式:

    library(reshape2)
    exData.m <- melt(exData, id.vars=c("Marker", "Mean"))
    
    ggplot(exData.m, aes(x=Mean, y=value, color=variable)) + geom_point()
    

    Result of plot

    根据经验,每个美学(x,y,颜色,形状,α,......)都需要绘制数据框中的列 . reshape2 库在这里很有帮助 .

  • 3

    要直接回答您的问题,请在第一个图中 ggplot 汇总所有颜色标识(此处为"Max"和"Min")并将其视为一个因素 . 然后它使用默认调色板,在this question的响应中以及Cookbook for R中对其进行了精美描述 . 所以"Max"被视为具有两种颜色的默认调色板中的第一种颜色 .

    在第二个图中,您指定了颜色编号(整数) . 在这种情况下, ggplot 将恢复为默认的R调色板,可以看作如下:

    y <- 1:6
    barplot(y,col=y)
    

    要使用 aes_string(...) 获取默认颜色,请使用@krlmlr描述的方法 .

相关问题