根据轴刻度位置显示的数据着色ggplot2轴刻度标签

问题描述 投票:5回答:1

我有这个数据集:

top_bot_5_both <- structure(list(
  name = structure(c(20L, 19L, 18L, 17L, 16L, 15L, 14L, 13L, 12L, 
                     11L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L), 
                   .Label = c("Michele Bachmann", "Donald Trump", "Ted Cruz", 
                              "Newt Gingrich", "Rick Santorum", "Terry McAuliffe", 
                              "Nancy Pelosi", "Debbie Wasserman Schultz", 
                              "Tammy Baldwin", "Joe Biden", "Rand Paul", "Jeb Bush", 
                              "John Kasich", "Barack Obama", "Bill Clinton", 
                              "Hillary Clinton", "Nathan Deal", "Tim Kaine", 
                              "Rob Portman", "Sherrod Brown"), 
                   class = "factor"),
  Party = c("Democratic", "Republican", "Democratic", "Republican", "Democratic", 
            "Democratic", "Democratic", "Republican", "Republican", "Republican", 
            "Republican", "Republican", "Republican", "Republican", "Republican", 
            "Democratic", "Democratic", "Democratic", "Democratic", "Democratic"), 
  total_ratings = c(35L, 48L, 51L, 49L, 296L, 41L, 599L, 64L, 80L, 55L, 
                    61L, 472L, 123L, 82L, 61L, 31L, 35L, 48L, 33L, 75L), 
  sum = c(22, 29, 21, 18, 96, 12, 172, 16, 18, 2, -86, -525, -94, -57, 
          -42, -19, -14, -7, -4, -1), 
  score = c(0.628571428571429, 0.604166666666667, 0.411764705882353, 
            0.36734693877551, 0.324324324324324, 0.292682926829268, 
            0.287145242070117, 0.25, 0.225, 0.0363636363636364, -1.40983606557377, 
            -1.11228813559322, -0.764227642276423, -0.695121951219512, 
            -0.688524590163934, -0.612903225806452, -0.4, -0.145833333333333, 
            -0.121212121212121, -0.0133333333333333)), 
  class = c("tbl_df", "tbl", "data.frame"), 
  row.names = c(NA, -20L), 
  .Names = c("name", "Party", "total_ratings", "sum", "score"))

我想制作一个柱形图,其中y轴文本镜像是图形本身的填充颜色。根据this thread的建议,我将color列添加到我的tibble中

top_bot_5_both <- top_bot_5_both %>%
  mutate(color = ifelse(Party == "Democratic", "#1A80C4", "#CC3D3D"))

然后将其绘制为:

ggplot(top_bot_5_both, aes(x = name, y = score, fill = Party)) +
  geom_col(size = 1, color = "black") +
  coord_flip() +
  geom_vline(xintercept = 10.5, size = 1.5, linetype = "twodash") +
  scale_fill_manual(values = c("Democratic" = "#1A80C4", "Republican" = "#CC3D3D")) +
  theme(axis.text = element_text(size = 12),
    axis.text.y = element_text(color = top_bot_5_both$color),
    axis.title = element_text(size = 14),
    legend.position = "bottom", 
    legend.title = element_blank())

enter image description here

在图中,fill正确识别每个政治家的党,但axis.text.y没有。例如,Michelle Bachmann是共和党人,因此她的专栏应该有红色填充(它确实如此)并且应该有红色轴文本(它没有)。

然后我决定用rev()将它包装在axis.text.y = element_text(color = rev(top_bot_5_both$color)中,ggplot(top_bot_5_both, aes(x = name, y = score, fill = Party)) + geom_col(size = 1, color = "black") + coord_flip() + geom_vline(xintercept = 10.5, size = 1.5, linetype = "twodash") + scale_fill_manual(values = c("Democratic" = "#1A80C4", "Republican" = "#CC3D3D")) + theme(axis.text = element_text(size = 12), axis.text.y = element_text(color = rev(top_bot_5_both$color)), axis.title = element_text(size = 14), legend.position = "bottom", legend.title = element_blank()) 创建了这个图表,它更接近正确。

enter image description here

top_bot_5_both$color

top_bot_5_both$name向量在tibble中的顺序正确,但它在实际绘图过程中以某种方式搞砸了。也许这与coord_flip()是一个因素有关,但我认为这是必要的,以便按降序绘制分数。

我试过的其他东西不起作用:

  • 摆脱top_bot_5_both$color并将y改为x等
  • 没有生成列ifelse(...)而是将element_text(color = ...)命令放在axis.text.y = element_text(color = ...)
  • 我不能手动这样做,因为我计划在未来重复这一分析,政治家在y轴上的顺序可能会改变

我做错了什么或者这里有错误吗?

r ggplot2
1个回答
4
投票

重要的是要意识到当你编写name时,你不是使用常规的ggplot2映射机制将数据映射到颜色,而是手动为特定的轴标签分配颜色。因此,您指定的颜色必须完全按正确的顺序排列。

检查数据框时,可以看到行的顺序与绘制顺序不同;顺序由order()因子的水平设定。因此,您还必须使用该顺序作为颜色。你可以使用colors <- top_bot_5_both$color[order(top_bot_5_both$name)] 函数来做到这一点:

ggplot(top_bot_5_both, aes(x = name, y = score, fill = Party)) +
  geom_col(size = 1, color = "black") +
  coord_flip() +
  geom_vline(xintercept = 10.5, size = 1.5, linetype = "twodash") +
  scale_fill_manual(values = c("Democratic" = "#1A80C4", "Republican" = "#CC3D3D")) +
  theme(axis.text = element_text(size = 12),
        axis.text.y = element_text(color = colors),
        axis.title = element_text(size = 14),
        legend.position = "bottom", 
        legend.title = element_blank())

现在,使用此颜色矢量,我们可以按预期制作绘图:

enter image description here

qazxswpoi

© www.soinside.com 2019 - 2024. All rights reserved.