【问题标题】:ggplot geom_histogram color by factor not working properlyggplot geom_histogram color by factor无法正常工作
【发布时间】:2016-12-06 06:32:37
【问题描述】:

在尝试根据因子列为我的堆叠直方图着色时;所有酒吧都有“绿色”屋顶?我希望酒吧顶部与酒吧本身的颜色相同。下图清楚地显示了问题所在。所有条形的顶部都有一条“绿色”水平线?

这是一个虚拟数据集:

BodyLength <- rnorm(100, mean = 50, sd = 3)

vector <- c("80","10","5","5")

colors <- c("black","blue","red","green")

color <- rep(colors,vector)

data <- data.frame(BodyLength,color)

还有我用来生成下图的程序:

plot <- ggplot(data = data, aes(x=data$BodyLength, color = factor(data$color), fill=I("transparent")))

plot <- plot + geom_histogram()

plot <- plot + scale_colour_manual(values = c("Black","blue","red","green"))

另外,由于数据列本身包含颜色名称,我是否不必在 scale_color_manual 中再次指定它们? ggplot 可以从数据本身中识别它们吗?但是我现在真的很想帮助解决第一个问题...谢谢。

【问题讨论】:

    标签: r plot ggplot2 colors


    【解决方案1】:

    这是一种无需写出矢量即可将颜色设置为 scale_colour_manual 的快速方法:

    data <- data.frame(BodyLength,color)
    data$color<- factor(data$color)
    

    然后,

    scale_colour_manual(values = levels(data$color))
    

    现在,关于您的第一个问题,我不知道您的酒吧为什么有绿色屋顶。但是,您可能希望查看 geom_histogram 中位置参数的一些不同选项,例如

    plot + geom_histogram(position="identity")
    

    ..或position="dodge"identity 选项更接近你想要的,但由于绿色是最后绘制的线,它会覆盖以前的颜色。

    我自己更喜欢密度图来解决这些问题。

    ggplot(data=data, aes(x=BodyLength, color=color)) + geom_density()
    ggplot(data=data, aes(x=BodyLength, fill=color)) + geom_density(alpha=.3)
    

    【讨论】:

    • plot+ geom_histogram(position ="identity") 似乎有效;除了现在所有彩色堆栈都位于它们各自垃圾箱的底部,即黑条下方。我要他们在上面。感谢您尝试大卫...如果我解决了问题,我会更新。
    • 对于您绘制的任何直方图,其中您覆盖了具有不同颜色轮廓和透明 bin 的 bin,图形程序必须决定如何进行覆盖。例如,当蓝色组的 bin 中有“0”时,R 在 Y = 0 处为蓝色绘制一条水平线。如果蓝色 bin 中有“1”,它将绘制一个高度为 Y 的矩形= 1,除非它被下一组覆盖,否则它将保持不变。
    • 在我的版本中,有很多黑条,因为黑色是最多的。然而,黑色是叠加层中的底部直方图层,绿色是最顶层;这是因为 factor() 函数。这就是为什么我的版本中的 Y = 0 线是绿色的。彩色堆栈位于它们各自 bin 的底部,因为如果对于任意 bin,如果黑色 = 5 和红色 = 2,则将有两条水平线。我无法想象您的最佳透明直方图将如何显示。
    • 如果您要使用plot &lt;- plot + geom_histogram(position="dodge"),您可能会发现透明直方图方法存在问题,尤其是对于靠近中间的 bin。它说明了每个 bin 有 4 种颜色并且它们是如何竞争的。 R应该如何显示覆盖不同颜色的单个bin? “屋顶”是factor() 订单中的最后一种颜色。这就是为什么您不会经常看到按照您建议的方式构建的直方图。
    • 我明白了。谢谢大卫。这至少正确地解决了我现在寻找解决方案的问题。当我用 data$color 而不是 fill = "transparent" 填充条时,问题不再存在。该图是针对期刊的,我试图在打印机墨水方面保持保守 - :
    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2016-01-02
    相关资源
    最近更新 更多