【问题标题】:r ggplot colored histogram is wrong colourr ggplot彩色直方图颜色错误
【发布时间】:2020-04-11 12:24:43
【问题描述】:

我已将我的代码精简为以下 MWE:

library(tidyverse)
library(ggplot2)

x<-rnorm(1000)

df <- data.frame(x = x)
df <- mutate(df, colors = 'blue')

p1<-ggplot(df, aes(x=x, fill=colors)) +
  geom_histogram()
p1

p2<-ggplot(df, aes(x=x), fill=colors) +
  geom_histogram()
p2

p3<-ggplot(df, aes(x=x)) +
  geom_histogram(fill=colors)
p3

我希望我的直方图为蓝色,但 p1 为红色,p2 为灰色,p3 抛出错误。

在我的实际应用中,我会使用不止一种颜色,因此使用mutate,我认为我可以让它适用于一种颜色,它也适用于其他颜色。

也许我上面的 MWE 太 MWE。这是一个更详细的代码:

x<-rnorm(1000)

df <- data.frame(x = x)
df <- mutate(df, colors = case_when(
    x < quantile(x,0.25) ~ "red",
    x >= quantile(x,0.25) & x < quantile(x,0.5) ~ "orange",
    x >= quantile(x,0.5) & x < quantile(x,0.75) ~ "blue",
    x >= quantile(x,0.75) ~ "green"
    )
  )

p1<-ggplot(df, aes(x=x, fill=colors)) +
  geom_histogram()
p1

这会返回一个有四种颜色的直方图,但它们不是蓝色、绿色、橙色和红色!

【问题讨论】:

  • 为什么在第三个 ggplot() 调用中使用两个填充参数?如果我是正确的,你只是想让你的三个直方图是不同的颜色?您不需要在 data.frame() 中将颜色定义为变量
  • @AsifLalDin 哎呀,这是我草率的复制粘贴。我不想要三个直方图,这是我为解决问题所做的三个尝试。
  • 您可以看到下面的两个答案,应该对其进行排序。干杯

标签: r ggplot2


【解决方案1】:

如果所需值已包含在数据框中,请使用scale_*_identity()。默认情况下,没有生成指南,因此您需要使用 guide 参数,以便在需要时生成指南。

ggplot(df, aes(x = x, fill = colors)) +
  geom_histogram(color = "white") +
  scale_fill_identity(guide = "legend")

【讨论】:

    【解决方案2】:

    你可以这样做

    x<-rnorm(1000)
    
    df <- data.frame(x = x)
    
    p1<-ggplot() +
      geom_histogram(data=df, aes(x=x),fill="blue")
    p1
    

    fill 参数无法理解一列的值。

    如果你有不同的颜色,这样就可以了:

    p4 <- ggplot(df, aes(x=x, fill=colors)) +
      geom_histogram() +
      scale_fill_manual(values=c("blue","green","orange","red"))
    p4
    

    请注意按字母顺序排列的颜色。

    【讨论】:

    • 这是真的,但我需要填充位取决于 df 中规定的颜色。
    • 准确地说,使用 mutate 可以让直方图变成彩色的。这有效,但似乎只适用于默认颜色。因此我的问题。
    • ggplot() + geom_histogram(data=df, aes(x=x),fill=unique(df$colors))
    • @Geoff 不是一种静态方法,您需要再次将颜色定义为值。请检查我的方法,您可能会发现它很有用。
    【解决方案3】:
    p4 <- ggplot(df, aes(x=x, fill=colors)) +
      geom_histogram(col="white") +
      scale_fill_manual(values=df$colors)
    p4
    

    如果您直接在数据框中指定颜色,则使用scale_fill_manual 函数并手动指定颜色。在这种情况下,您只有一个值(常量)。

    使用一种以上的颜色更容易看到。

    df <- mutate(df, colors = sample(c('blue','red'), replace=TRUE, size=1000))
    
    ggplot(df, aes(x=x, fill=colors)) +
          geom_histogram(col="white") +
          scale_fill_manual(values=df$colors)
    

    【讨论】:

      【解决方案4】:

      主要思想: 将颜色字段转换为因子,并使用级别来获取 scale_fill_manual 函数中的差异颜色。希望对您有所帮助,如果我正确理解您的问题!!!

      x<-rnorm(1000)
      col <- if_else(between(x,-1,1), "red", "blue")
      
      #color <- c("blue", "red")
      df <- data.frame(x = x, color = as.factor(col))
      
      p1 <- ggplot(df, aes(x=x, fill = color)) +
        geom_histogram() +
        scale_fill_manual(values = levels(df$color))
      plot(p1)
      

      你会得到如下想要的结果:

      【讨论】:

        【解决方案5】:
        library(ggplot2)
        
        x<-rnorm(1000)
        
        df <- data.frame(x = x)
        
        p1<-ggplot(df, aes(x=x, )) +
          geom_histogram(fill='blue',col='white')
        p1
        
        p2<-ggplot(df, aes(x=x)) +
          geom_histogram(fill='red',col='white')
        p2
        
        p3<-ggplot(df, aes(x=x)) +
          geom_histogram(fill='green',col='white')
        p3
        

        这很简单。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-08-22
          • 2022-01-17
          • 2021-08-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-23
          • 1970-01-01
          相关资源
          最近更新 更多