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)
结果如下:
这就是我所拥有的 - 希望这是有用的。如前所述@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)
| 归档时间: |
|
| 查看次数: |
3088 次 |
| 最近记录: |