如何让ggplot订购堆积条形图

时间:2017-03-22 07:21:42

标签: r ggplot2 bar-chart

我有以下R代码,我在其中转换数据,然后按特定列进行排序:

df2 <- df %>% 
group_by(V2, news) %>% 
tally() %>% 
complete(news, fill = list(n = 0)) %>% 
mutate(percentage = n / sum(n) * 100)

df22 <- df2[order(df2$news, -df2$percentage),]

我想应用有序数据&#34; df22&#34;在ggplot中:

ggplot(df22, aes(x = V2, y = percentage, fill = factor(news, labels = c("Read","Otherwise")))) +
geom_bar(stat = "identity", position = "fill", width = .7) +
coord_flip() + guides(fill = guide_legend(title = "Online News")) + 
scale_fill_grey(start = .1, end = .6) + xlab("Country") + ylab("Share")

不幸的是,ggplot仍然给我一个没有订单的情节:

enter image description here

有谁知道我的代码出了什么问题?这与订单条形图不同,每个条形码具有单个值,例如此处Reorder bars in geom_bar ggplot2。我尝试按特定类别的因素订购购物车。特别是,我希望首先看到阅读新闻份额最大的国家。

以下是数据:

               V2      news     n   percentage
 1  United States News Read  1583   1.845139
 2    Netherlands News Read  1536   1.790356
 3        Germany News Read  1417   1.651650
 4      Singapore News Read  1335   1.556071
 5  United States Otherwise  581    0.6772114
 6    Netherlands Otherwise  350    0.4079587
 7        Germany Otherwise  623    0.7261665     
 8      Singapore Otherwise  635    0.7401536

我使用了以下R代码:

df2 <- df %>% 
group_by(V2, news) %>% 
tally() %>% 
complete(news, fill = list(n = 114)) %>% 
mutate(percentage = n / sum(n) * 100)

df2 <- df2[order(df2$news, -df2$percentage),]

df2 <- df2 %>% group_by(news, percentage) %>% arrange(desc(percentage)) 
df2$V2 <- factor(df2$V2, levels = unique(df2$V2)) 


ggplot(df2, aes(x = V2, y = percentage, fill = news))+ 
geom_bar(stat = "identity", position = "stack") + 
guides(fill = guide_legend(title = "Online News")) + 
coord_flip() + 
scale_x_discrete(limits = rev(levels(df2$V2)))

一切都很好,除了一些国家由于某种原因打破了秩序,我不明白为什么。这是图片:

enter image description here

我用男士的提示做了什么,我用过&#34;安排&#34;命令而不是dplyr

df4 <- arrange(df2, news, desc(percentage))

结果如下:

enter image description here

1 个答案:

答案 0 :(得分:4)

这就是我所拥有的 - 希望这很有用。如上所述@Axeman - 诀窍是将标签重新排序为因子。此外,使用coord_flip()重新排序相反方向的标签,因此需要scale_x_discrete()

我正在使用您提供的小样本。

library(ggplot2)
library(dplyr)

df <- read.csv("data.csv")

df <- arrange(df, news, desc(Percentage))
df$V2 <- factor(df$V2, levels = unique(df$V2)) 

ggplot(df, aes(x = V2, y = Percentage, fill = news))+ 
    geom_bar(stat = "identity", position = "stack") + 
    guides(fill = guide_legend(title = "Online News")) + 
    coord_flip() + 
    scale_x_discrete(limits = rev(levels(df$V2)))

enter image description here