根据轴刻度位置

时间:2017-12-21 23:52:44

标签: 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"))

我想制作一个柱形图,其中y轴文本镜像是图形本身的填充颜色。根据{{​​3}}的建议,我将列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())

this thread

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

然后我决定使用创建此图表的rev()将其打包在axis.text.y = element_text(color = rev(top_bot_5_both$color)中, close 更正

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向量在tibble中的顺序正确,但在实际绘图过程中它会以某种方式混乱。也许它与top_bot_5_both$name是一个因素有关,但我认为这是必要的,以便按降序绘制分数。

我试过的其他不起作用的事情:

  • 摆脱coord_flip()并将y更改为x等
  • 未生成列top_bot_5_both$color而是将ifelse(...)命令放入element_text(color = ...)
  • 我无法手动执行此操作,因为我计划在未来重复此分析,并且政治家&#39; y轴上的顺序可能会改变

我做错了什么,或者某处有错误?

1 个答案:

答案 0 :(得分: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())

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

{{1}}

enter image description here