r - 在 R 图表上对数据标签进行排序
问题描述
我刚刚开始学习如何使用 R 并且正在关注在线教程。我已经创建了一个排序的圆形绘制条形图,但现在我想添加数据标签。我不知道如何对标签进行排序,以便它们出现在右侧栏上。这是我的代码:
library(tidyverse)
data <- data.frame(
id=seq(1,11),
name=AllMyLego$`Grouped Themes`,
value=AllMyLego$`Minifigs`
)
label_data <- data
number_of_bar <- nrow(label_data)
angle <- 90-360*(label_data$id-0.5)/number_of_bar
label_data$hjust<-ifelse(angle < -90, 1, 0)
label_data$angle <- ifelse(angle < -90, angle+180, angle)
data %>%
mutate(name = fct_reorder(name, value)) %>%
ggplot( aes(x=name, y=value)) +
geom_bar(stat="identity", fill=alpha("dark green",0.5)) +
ylim(-50,280)+
theme_minimal()+
theme(axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank(),
plot.margin = unit(rep(-2,4),"cm"))+
coord_polar(start=0)+
geom_text(data=label_data, aes(x=id, y=value+10, label=name, hjust=hjust), color="black", fontface="bold",alpha=0.6, size=2.5, angle= label_data$angle, inherit.aes = FALSE )
这会生成一个如下所示的图表:
我已经尝试针对 label_data 数据以及单独针对 id 字段运行 mutate() ,但没有证明是成功的。可悲的是,我正在关注的在线教程不包括标签在他们的示例中是如何排序的。任何人都可以直接告诉我吗?
这是我正在使用的数据:
AllMyLego <- structure(list(`Grouped Themes` = structure(1:11, .Label = c("City",
"Dimensions", "Film and TV", "Ideas", "Lego Movies", "Ninjago",
"Other", "Pirates", "Seasonal", "Star Wars", "Super Heroes"), class = "factor"),
Minifigs = c(105L, 9L, 22L, 9L, 57L, 154L, 49L, 11L, 39L,
255L, 67L)), class = "data.frame", row.names = c(NA, -11L
))
谢谢基思
解决方案
我想你正在寻找这个:
label_data <- data
number_of_bar <- nrow(label_data)
label_data <- label_data %>% mutate(name = fct_reorder(name, value))
angle <- 90-360 * (order(order(label_data$name)) - 0.5) / number_of_bar
label_data$hjust <- ifelse(angle < -90, 1, 0)
label_data$angle <- ifelse(angle < -90, angle + 180, angle)
data %>%
mutate(name = fct_reorder(name, value)) %>%
ggplot(aes(x = name, y = value)) +
geom_bar(stat="identity", fill = alpha("dark green", 0.5)) +
ylim(-50, 280)+
theme_void() +
coord_polar(start = 0, direction = 1) +
geom_text(data = label_data, aes(x = name, y = value + 10,
label = name, hjust = hjust),
color = "black", fontface = "bold",alpha = 0.6, size = 2.5,
angle = label_data$angle, inherit.aes = FALSE)
请注意,最重要的东西是x = name
在aes
里面使用的geom_text
。这也意味着要事先确定标签的绘制顺序。