我有以下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仍然给我一个没有订单的情节:
有谁知道我的代码出了什么问题?这与订单条形图不同,每个条形码具有单个值,例如此处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)))
一切都很好,除了一些国家由于某种原因打破了秩序,我不明白为什么。这是图片:
我用男士的提示做了什么,我用过&#34;安排&#34;命令而不是dplyr
df4 <- arrange(df2, news, desc(percentage))
结果如下:
答案 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)))