我有这个数据集:
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())
在图表中,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())
top_bot_5_both$color
向量在tibble中的顺序正确,但在实际绘图过程中它会以某种方式混乱。也许它与top_bot_5_both$name
是一个因素有关,但我认为这是必要的,以便按降序绘制分数。
我试过的其他不起作用的事情:
coord_flip()
并将y更改为x等top_bot_5_both$color
而是将ifelse(...)
命令放入element_text(color = ...)
我做错了什么,或者某处有错误?
答案 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}}