如何使ggplot订购堆叠条形图

Lau*_*ura 1 r bar-chart ggplot2

我有以下 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),]
Run Code Online (Sandbox Code Playgroud)

我想在 ggplot 中应用有序数据“df22”:

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")
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

有谁知道我的代码有什么问题?这与使用每个条形图的单个值对条形图进行排序不同,例如在 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
Run Code Online (Sandbox Code Playgroud)

我使用了以下 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)))
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

我根据人们的提示做了什么,我使用了“排列”命令而不是 dplyr

df4 <- arrange(df2, news, desc(percentage))
Run Code Online (Sandbox Code Playgroud)

结果如下:

在此处输入图片说明

roy*_*yr2 6

这就是我所拥有的 - 希望这是有用的。如前所述@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)))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 或者直接使用`df$V2 &lt;- factor(df$V2, levels = rev(unique(df$V2)))`。 (2认同)
  • `arrange` 忽略分组(现在有一段时间了)。将 dplyr 行替换为 `df &lt;-arrange(df, news, desc(Percentage))`。 (2认同)