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

jry*_*ify 5 r ggplot2

我有这个数据集:

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"))
Run Code Online (Sandbox Code Playgroud)

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

top_bot_5_both <- top_bot_5_both %>%
  mutate(color = ifelse(Party == "Democratic", "#1A80C4", "#CC3D3D"))
Run Code Online (Sandbox Code Playgroud)

然后将其绘制成如下图:

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())
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在图表中,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())
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

top_bot_5_both$color向量是在tibble正确的顺序,但它在某种程度上得到实际的绘图过程中搞砸了.也许它与top_bot_5_both$name成为一个因素有关,但我认为这是必要的,以便按降序绘制得分.

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

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

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

Cla*_*lke 8

重要的是要意识到,在编写 时axis.text.y = element_text(color = ...),您不是使用常规的 ggplot2 映射机制将数据映射到颜色,而是手动为特定轴标签分配颜色。因此,您分配的颜色需要完全按照正确的顺序排列。

当您检查数据框时,您可以看到行的绘制顺序不同;顺序由name因子的水平设置。因此,您也必须对颜色使用该顺序。您可以使用以下order()功能来做到这一点:

colors <- top_bot_5_both$color[order(top_bot_5_both$name)]
Run Code Online (Sandbox Code Playgroud)

现在,使用这个颜色向量,我们可以按预期绘制图:

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())
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明