当数据类别不同时如何在多个堆叠的条形图上获得相同的图例类别

时间:2019-05-07 21:47:39

标签: r ggplot2

这是我第一次在此处发布信息,因此请对我轻松一点。我已经在这个问题上搜寻了好几天了,却找不到解决方案,如果在其他地方也回答过,对不起。

我正在ggplot中制作几个堆叠的条形图,并希望所有图例上的图例类别都相同(即每个类别在每个图上具有相同的颜色),而不必手动设置所有颜色。问题是图形之间的类别不相同,因此仅指定调色板会导致类别具有不同的颜色。

我无法使用正在使用的实际数据,因此我创建了类似的数据框来模拟问题。

以下是示例df:

  Year    Trial    Concentration    Chemical
  2013      1           0.8         Benzene
  2013      1           1.5         Toluene
  2013      1           0.8         Hexane 
  2013      2           1.5         Toluene
  2013      2           0.8         Carboxylic Acid
  2013      2           1.5         Acetone
  2013      3           0.8         Ethanol
  2013      3           1.9         Carboxylic Acid
  2013      3           3.1         Acetone
  2014      1           1.8         Benzene
  2014      1           2.5         Toluene
  2014      1           0.6         Methanol 
  2014      2           1.3         Toluene
  2014      2           1.8         Carboxylic Acid
  2014      2           2.5         Butane
  2014      3           1.5         Ethanol
  2014      3           1.2         Carboxylic Acid
  2014      3           3.5         Acetone
  ...      ...          ...         ...

这是图形的代码:

  list <- split(df, df$Year)
  plot_list <- list()

for (i in 1:5) {
    df <- list[[i]]

    p <- ggplot(df, aes(x = Trial, y = Concentration, width=0.8)) +
         geom_bar(stat = "identity", aes(fill = Chemical))
    plot_list = p
}

这是结果图:

Stacked Bar Plot

因此,例如,在2013年图表上,棕黄色=苯,在2014年图表上,棕黄色=丁烷。我想使图例在两个图表上都相同(即2014年的图表将在图例中显示苯,即使该年未进行测量也是如此),并且每种化学品的颜色都应相同。像这样:

Ideal Stacked Bar Graph

我知道如何使用scale_file_manual手动完成此操作,但是我大约有30种化学药品,因此我不希望手动进行设置。如果您有任何疑问或需要其他信息,请告诉我。在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

我会提前建立一个表格来链接颜色和化学名称

library(data.table)
library(tidyverse)
library(RColorBrewer)

df <-
  fread("
    Year    Trial    Concentration    Chemical
    2013      1           0.8         Benzene
    2013      1           1.5         Toluene
    2013      1           0.8         Hexane 
    2013      2           1.5         Toluene
    2013      2           0.8         Carboxylic_Acid
    2013      2           1.5         Acetone
    2013      3           0.8         Ethanol
    2013      3           1.9         Carboxylic_Acid
    2013      3           3.1         Acetone
    2014      1           1.8         Benzene
    2014      1           2.5         Toluene
    2014      1           0.6         Methanol 
    2014      2           1.3         Toluene
    2014      2           1.8         Carboxylic_Acid
    2014      2           2.5         Butane
    2014      3           1.5         Ethanol
    2014      3           1.2         Carboxylic_Acid
    2014      3           3.5         Acetone
  ")

chem_colors <-
  tibble(Chemical = factor(unique(df$Chemical))) %>% 
  mutate(color = brewer.pal(n = n(), name = "RdBu")[as.integer(Chemical)])

# you can use your loop here instead
plot_trials <- function(year) {
  ggplot(filter(df, Year == year), aes(x = Trial, y = Concentration, width=0.8)) +
    geom_bar(stat = "identity", aes(fill = Chemical)) +
    scale_fill_manual(values = chem_colors$color, labels = chem_colors$Chemical)
}


gridExtra::grid.arrange(
  plot_trials(2013),
  plot_trials(2014), 
  nrow = 1
)

enter image description here

答案 1 :(得分:0)

这是我要为大数据集工作的答案。我在上面使用了yake84的答案,并添加了colorRampPalette()函数以能够从调色板中提取更多颜色。我还将chem_colors更改为命名矢量,因为作为小标题,这些颜色未映射到我的数据框中的化学物质。

    <div style="position:relative;">
        <div class="animatedParent shrink" style="color:#ddd;background-color:#424242;text-align:center;padding:50px 80px;">
            <div class="container">
                <div class="row justify-content-center">
                    <div class="col">
                        <div class="card-group animatedParent mx-auto" data-sequence='250'>
                            <div class="card animated fadeIn slow rounded-0" style="max-width: 250px;" data-id='1'>
                                <img class="card-img-top animated fadeIn slow rounded-circle" src="/images/justin.jpg" alt="Justin Worsham" data-id='2'>
                                <div class="card-header animated fadeIn slow" style="color:black; font-weight:bold;" data-id='3'>
                                    Justin Worsham
                                </div>
                                <div class="card-body animated fadeIn slow" style="color:black;"  data-id='4'>
                                   <ul>
                                       <li>CEO</li>
                                       <li>Head Designer</li>
                                       <li>Head Developer</li>
                                       <li>Head Video Editor</li>
                                   </ul>
                                </div>
                            </div>
                            <div class="card animated fadeIn slow" style="max-width: 250px;" data-id='1'>
                                <img class="card-img-top animated fadeIn slow rounded-circle" src="/images/daniel.jpg" alt="Daniel Crews" data-id='2'>
                                <div class="card-header animated fadeIn slow" style="color:black; font-weight:bold;" data-id='3'>
                                    Daniel Crews
                                </div>
                                <div class="card-body animated fadeIn slow" style="color:black;"  data-id='4'>
                                   <ul>
                                       <li>CFO</li>
                                       <li>Designer</li>
                                       <li>Developer</li>
                                       <li>Video Editor</li>
                                   </ul>
                                </div>
                            </div>
                            <div class="card animated fadeIn slow rounded-0" style="max-width: 250px;" data-id='1'>
                                <img class="card-img-top animated fadeIn slow rounded-circle" src="/images/julian.jpg" alt="Julian Ellis" data-id='2'>
                                <div class="card-header animated fadeIn slow" style="color:black; font-weight:bold;" data-id='3'>
                                    Julian Ellis
                                </div>
                                <div class="card-body animated fadeIn slow" style="color:black;"  data-id='4'>
                                   <ul>
                                       <li>Jr Developer</li>
                                       <li>Server Side Code</li>
                                       <li>Intern Specialist</li>
                                       <li>Back-end Developer</li>
                                   </ul>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>