ggplot2圆形堆叠的条形图重复标签而没有任何条形

时间:2019-01-10 03:51:31

标签: r ggplot2

我正在尝试使用ggplot重新创建this example,以创建圆形条形图。除了要创建标准的条形图,我要创建一个堆叠的条形图。我已经很接近了,但是由于某种原因,在此圆形条形图中重复了标签。我认为问题在于我创建的id与示例匹配,但我不确定如何解决它。

df <- structure(list(team = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, NA, 1L, 2L, 3L, 4L, 5L, 
6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, NA, 1L, 2L, 3L, 
4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, NA), .Label = c("Team1", 
"Team2", "Team3", "Team4", "Team5", "Team6", "Team7", "Team8", "Team9", "Team10", 
"Team11", "Team12", "Team13", "Team14", "Team15"), class = "factor"), 
    variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("variable1", 
    "variable2", "variable3"), class = "factor"), value = c(3.91666666666667, 
    3.25, 3.88888888888889, 2.83333333333333, 3.16666666666667, 
    2.93333333333333, 2.66666666666667, 3.4, 3.33333333333333, 
    3.44444444444444, 3.41666666666667, 4, 4, 3.5, 4, 3.33333333333333, 
    3.8, 3.5, 3.86666666666667, 3, 2.96666666666667, 3.2, 3, 
    3.52, 3.26666666666667, 3.2, 3.45, 3.9, 3.6, 3.35, 3.86666666666667, 
    3, 3.91666666666667, 3.58333333333333, 4, 3.83333333333333, 
    3.44444444444444, 3.26666666666667, 3, 3.6, 3.33333333333333, 
    3.55555555555556, 3.66666666666667, 3.83333333333333, 3.5, 
    3.41666666666667, 4, 2.33333333333333)), row.names = c(NA, 
-48L), class = "data.frame")

df$id=seq(1, nrow(df))
label_data=df
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)

ggplot(data=df, aes(x=team, y=value, fill=variable)) +
  geom_bar(stat='identity') +
  ylim(-100,120) +
  theme_minimal() +
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank(),
    plot.margin = unit(rep(-1,4), "cm") 
  ) +
  coord_polar(start = 0) +
  geom_text(data=label_data, aes(x = id, y = 20, label=team, hjust=hjust), color="black", fontface="bold",alpha=0.6, size=2.5, angle= label_data$angle, inherit.aes = FALSE )

2 个答案:

答案 0 :(得分:4)

是的,存在一个id创建方式的问题。我们需要为每个id使用唯一的team,并根据number_of_bar的唯一实例对team进行更改。

number_of_bar = length(unique(df$team))
df$id = as.numeric(as.factor(df$team))
label_data = df
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)

ggplot(data=df, aes(x=team, y=value, fill=variable)) +
   geom_bar(stat='identity') +
   ylim(-100,120) +
   theme_minimal() +
   theme(
     axis.text = element_blank(),
     axis.title = element_blank(),
     panel.grid = element_blank(),
     plot.margin = unit(rep(-1,4), "cm") 
     ) +
   coord_polar(start = 0) +
  geom_text(data=label_data, aes(x = id, y = 20, label=team, hjust=hjust),
  color="black", fontface="bold",alpha=0.6, size=2.5,
  angle= label_data$angle, inherit.aes = FALSE )

enter image description here

答案 1 :(得分:1)

由于每个团队有多行,因此需要重新编写代码,以使x值和角度都基于团队,因此不能只使用行号:

number_of_bar= length(unique(label_data$team))
angle= 90 - 360 * (as.numeric(str_extract(label_data$team, "\\d+$")) - 0.5) / number_of_bar
label_data$hjust<-ifelse( angle < -90, 1, 0)
label_data$angle<-ifelse(angle < -90, angle+180, angle)

ggplot(data=df, aes(x=team, y=value, fill=variable)) +
geom_bar(stat='identity') +
ylim(-100,120) +
theme_minimal() +
theme(
axis.text = element_blank(),
axis.title = element_blank(),
panel.grid = element_blank(),
plot.margin = unit(rep(-1,4), "cm") 
) +
coord_polar(start = 0) +
geom_text(data=label_data, aes(x = team, y = 20, label=team, hjust=hjust), color="black", fontface="bold",alpha=0.6, size=2.5, angle= label_data$angle, inherit.aes = FALSE )