ggplot2 coord_polar在使用fill时保留顺序

时间:2017-01-18 10:39:05

标签: r ggplot2

fill指定aes参数会导致饼图的顺序相反,因此中断/标签将不再与饼图匹配。请参阅下面的示例和结果图。

df = data.frame(Var1 = letters[1:5], Var2 = c(6, 31, 34, 66, 77))    
df$Var1 = factor(df$Var1, levels = df$Var1, ordered = T)

# just fine, but no colors
ggplot(df, aes(x = 1,
               y = Var2)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("red","green","yellow","black","white"),
                    guide_legend(title = "My_Title")) +
  scale_y_continuous(breaks = (cumsum(df$Var2) -
                                 df$Var2 / 2),
                     labels = df$Var1)

# reverse order appears
ggplot(df, aes(x = 1,
               y = Var2,
               fill = Var1)) +
  geom_bar(width = 1, stat = "identity") +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("red","green","yellow","black","white"),
                    guide_legend(title = "My_Title")) +
  scale_y_continuous(breaks = (cumsum(df$Var2) -
                                 df$Var2 / 2),
                     labels = df$Var1)

just fine reverse order

2 个答案:

答案 0 :(得分:2)

堆叠将以反向因子顺序(按v2.2.0)进行,因此我们可以使用以下代码按原始顺序堆叠:

localStorage: new Backbone.LocalStorage("SomeCollection"),

此外,您可以使用ggplot(df, aes(x = 1, y = Var2, fill = forcats::fct_rev(Var1))) + geom_bar(width = 1, stat = "identity", col = 1) + coord_polar(theta = "y") + scale_y_continuous(breaks = (cumsum(df$Var2) - df$Var2 / 2), labels = df$Var1) 代替geom_col

答案 1 :(得分:0)

另一种颠倒堆栈顺序的方法是使用position_stack(reverse=TRUE)

df = data.frame(Var1 = letters[1:5], Var2 = c(6, 31, 34, 66, 77))    
df$Var1 = factor(df$Var1, levels = df$Var1, ordered = T)

library(ggplot2)

# reverse order appears
ggplot(df, aes(x = 1,
               y = Var2,
               fill = Var1)) +
  geom_bar(width = 1, 
           stat = "identity", 
           position = position_stack(reverse = TRUE)) +
  coord_polar(theta = "y") +
  scale_fill_manual(values = c("red","green","yellow","black","white"),
                    guide_legend(title = "My_Title")) +
  scale_y_continuous(breaks = (cumsum(df$Var2) - df$Var2 / 2), labels = df$Var1)