【问题标题】:Multiple colour scales in one stacked bar plot using ggplot使用 ggplot 在一个堆叠条形图中使用多个色标
【发布时间】:2013-10-26 10:35:12
【问题描述】:

我创建了一个堆积条形图,描绘了市内政党在几年内的议会席位分布(= y 轴)(= x 轴)。使用的代码和一些数据如下。不幸的是,我还没有足够的积分来发布图表。

不同政党还与一个称为“意识形态”的变量相关联,作为不同政治取向(“进步”、“温和”、“保守”)的类别。

我想以这样一种方式修改颜色,例如保守党派有不同的忧郁;所有进步党派都有不同的绿色;和所有温和​​的政党,例如不同种类的红色;

意识形态上的变量在同一个数据框(y)中。

任何提示如何获得此修改?我已经尝试过 color=factor(ideology) 和 group=ideology 但无济于事。我也知道这个相关条目 Using a pre-defined color palette in ggplot 但它与我的问题无关。

非常感谢。

使用的命令:

    municipality.plot <- ggplot(y, aes(x=as.factor(year), y=seats, fill=party, color=party)) +
      geom_bar(bandwidth=1, stat="identity", group="party", position="fill") +
      labs(x="year", y="% of seats for municipality")

样本数据:

   year district.id                                                         party seats ideology
1  2012         127                  Stranka Pravde I Razvoja Bosne I Hercegovine     1        p
2  2012         127                                Savez Za Bolju Buducnost (SBB)     3        p
3  2008         127                              Stranka Demokratske Akcije (SDA)    13        p
4  2004         127                              Stranka Demokratske Akcije (SDA)    14        p
5  2008         127                          Hrvatska Demokratska Zajednica (HDZ)     1        c
6  2008         127                  Stranka Pravde I Razvoja Bosne I Hercegovine     1        p
7  2012         127                        Stranka Za Bosnu I Hercegovinu (SzBiH)     4        p
8  2000         127                              Socijaldemokratska Partija (SDP)     8        m
9  2012         127                     Narodna Stranka Radom Za Boljitak (NSRzB)     2        m
10 2012         127                            Socijaldemokratska Unija Bih (SDU)     1        p
11 2000         127                                         Koalicija - SDA, SBiH    15        p
12 2008         127                              Socijaldemokratska Partija (SDP)     5        m
13 2008         127                     Narodna Stranka Radom Za Boljitak (NSRzB)     1        m
14 2008         127                                          Koalicija - LDS, SDU     2        m
15 2000         127 Lgk-liberalno-gradanska Koalicija Bih (liberali Bih, Gds Bih)     1        m
16 2000         127                               Nova Hrvatska Inicijativa (NHI)     1        c
17 1997         127                              Socijaldemokratska Partija (SDP)     3        m
18 2012         127                              Socijaldemokratska Partija (SDP)     6        m
19 2004         127                        Stranka Za Bosnu I Hercegovinu (SzBiH)     5        p
20 1997         127                 Bosanskohercegovacka Patriotska Stranka (BPS)     9        p
21 2000         127                 Bosanskohercegovacka Patriotska Stranka (BPS)     3        p
22 2008         127                        Stranka Za Bosnu I Hercegovinu (SzBiH)     4        p
23 1997         127                          Hrvatska Demokratska Zajednica (HDZ)     5        c
24 2000         127                          Hrvatska Demokratska Zajednica (HDZ)     2        c
25 2012         127                              Stranka Demokratske Akcije (SDA)    10        p
26 2004         127                              Socijaldemokratska Partija (SDP)     6        m
27 1997         127                          Koalicija - SDA, SBiH, Liberali, GDS    13        p

【问题讨论】:

    标签: r colors ggplot2 bar-chart


    【解决方案1】:
    # load relevant packages
    library(scales)
    library(grid)
    library(ggplot2)
    library(plyr)
    
    # assume your data is called df
    # order data by year, ideology and party
    df2 <- arrange(df, year, ideology, party)
    
    ########################################
    
    
    # create one colour palette per ideology
    
    # count number of parties per ideology
    tt <- with(df2[!duplicated(df2$party), ], table(ideology))
    
    # conservative parties blues
    # progressive parties green
    # moderate parties red    
    blue <- brewer_pal(pal = "Blues")(tt[names(tt) == "c"])
    green <- brewer_pal(pal = "Greens")(tt[names(tt) == "p"])
    red <- brewer_pal(pal = "Reds")(tt[names(tt) == "m"])
    
    # create data on party and ideology
    party_df <- df2[!duplicated(df2$party), c("party", "ideology")]
    
    # set levels of ideologies; c, p, m
    party_df$ideology <- factor(party_df$ideology, levels = c("c", "p", "m"))
    
    # order by ideology and party
    party_df <- arrange(party_df, ideology, party)
    
    # add fill colours
    party_df$fill <- c(blue, green, red)
    
    # set levels of parties based on the order of parties in party_df
    party_df$party <- factor(party_df$party, levels = party_df$party)
    
    # use same factor levels for parties in df2
    df2$party <- factor(df2$party, levels = party_df$party)
    
    ##################################
    
    
    # Alternative 1. Plot with one legend
    
    g1 <- ggplot(data = df2, aes(x = as.factor(year),
                           y = seats,
                           fill = party)) +
      geom_bar(stat = "identity", position = "fill") +
      labs(x = "year", y = "% of seats for municipality") +
      coord_cartesian(ylim = c(0, 1)) +
      scale_fill_manual(values = party_df$fill, name = "Parties") +
      theme_classic()
    g1
    

    #####################################3
    # alt 2. Plot with separate legends for each ideology
    
    
    # create separate plots for each ideology to get legends
    
    # conservative parties blue
    cons <- ggplot(data = df2[df2$ideology == "c", ],
                   aes(x = as.factor(year),
                       y = seats,
                       fill = party)) +
      geom_bar(stat = "identity", position = "fill") +
      scale_fill_manual(values = blue, name = "Conservative parties" )
    
    
    # extract 'cons' legend
    tmp <- ggplot_gtable(ggplot_build(cons))
    leg <- which(sapply(tmp$grobs, function(x) x$name) ==  "guide-box")
    legend_cons <- tmp$grobs[[leg]]
    
    
    # progressive parties green
    prog <- ggplot(data = df2[df2$ideology == "p", ],
                   aes(x = as.factor(year),
                       y = seats,
                       fill = party)) +
      geom_bar(stat = "identity", position = "fill") +
      scale_fill_manual(values = green, name = "Progressive parties" )
    
    # extract 'prog' legend
    tmp <- ggplot_gtable(ggplot_build(prog))
    leg <- which(sapply(tmp$grobs, function(x) x$name) ==  "guide-box")
    legend_prog <- tmp$grobs[[leg]]
    
    
    # moderate parties red
    mod <- ggplot(data = df2[df2$ideology == "m", ],
                  aes(x = as.factor(year),
                      y = seats,
                      fill = party)) +
      geom_bar(stat = "identity", position = "fill") +
      scale_fill_manual(values = red, name = "Moderate parties" )
    
    
    # extract 'mod' legend
    tmp <- ggplot_gtable(ggplot_build(mod))
    leg <- which(sapply(tmp$grobs, function(x) x$name) ==  "guide-box")
    legend_mod <- tmp$grobs[[leg]]
    
    #######################################
    
    
    # arrange plot and legends
    
    # define plotting regions (viewports) for plot and legends
    vp_plot <- viewport(x = 0.25, y = 0.5,
                        width = 0.5, height = 1)
    
    vp_legend_cons <- viewport(x = 0.66, y = 0.87,
                               width = 0.5, height = 0.15)
    
    vp_legend_prog <- viewport(x = 0.7, y = 0.55,
                               width = 0.5, height = 0.60)
    
    vp_legend_mod <- viewport(x = 0.75, y = 0.2,
                              width = 0.5, height = 0.30)
    
    # clear current device
    grid.newpage()
    
    # add objects to the viewports
    # plot without legend
    print(g1 + theme(legend.position = "none"), vp = vp_plot)
    upViewport(0)
    
    # legends
    pushViewport(vp_legend_cons)
    grid.draw(legend_cons)
    upViewport(0)
    
    pushViewport(vp_legend_prog)
    grid.draw(legend_prog)  
    upViewport(0)
    
    pushViewport(vp_legend_mod)
    grid.draw(legend_mod)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-03
      • 2020-10-06
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-06-18
      • 2012-08-05
      • 1970-01-01
      相关资源
      最近更新 更多