首页 > 解决方案 > 在 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
))

谢谢基思

标签: rsortinggraph

解决方案


我想你正在寻找这个:

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 = nameaes里面使用的geom_text。这也意味着要事先确定标签的绘制顺序。


推荐阅读