ggplot2:防止geom_bar按字母顺序排列,并且y比例不显示中断

时间:2018-12-06 18:08:40

标签: r ggplot2

我的ggplot有两个问题。

数据:

> dput(cts2)
structure(list(country_name = c("United States", "Canada", "India", 
"Bots", "Estonia", "Mexico", "Portugal", "Finland", "United Kingdom", 
"New Zealand", "Australia", "Russia", "Denmark", "Sweden", "Poland", 
"Ireland", "Ghana", "Netherlands", "Chile", "Other"), freq = c(716288L, 
77290L, 14925L, 12393L, 9526L, 9307L, 9003L, 6733L, 6174L, 3860L, 
3706L, 3553L, 3444L, 2371L, 1768L, 1532L, 523L, 286L, 234L, 909L
)), row.names = c(54L, 9L, 24L, 55L, 14L, 32L, 39L, 15L, 53L, 
34L, 3L, 44L, 13L, 49L, 38L, 25L, 19L, 33L, 10L, 27L), class = "data.frame")

如您所见,数据已经按照我想要的顺序排列了。最高到最低,但应在末尾的“其他”除外。现在,当我使用geom_bar尝试简单的ggplot时:

ggplot(cts2, aes(x=factor(country_name), y=freq)) +
  geom_bar(stat="identity")+ 
  scale_y_continuous(trans='sqrt', labels = scales::comma, breaks = c(400, 10000, 100000, 700000))+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

enter image description here

结果有两个主要问题。

  1. 条形按字母顺序排列。在查看有关此问题的其他问题时,答案始终是“使用stat="identity"”或“使用因素”。好了,正如您所看到的,我都没有任何作用。
  2. Y比例尺不显示400的水平。400本身是任意的,因为我想添加很多休息时间。最终的条形图将是一个大图像,因此有更多细节的空间。

关于Y比例尺,即使使用trans='sqrt',美国数据点也确实很难看到其余数据项之间的差异。有没有更好的可视化方法? Log2和Log10看起来都更糟。

1 个答案:

答案 0 :(得分:1)

您需要设置因子levels。我的猜测是,设置400个标签不会留出足够的空间来打印标签而不会变成负片。在sqrt变换下不能存在负数。

ggplot(data = cts2, aes(x=factor(country_name, levels = c(unique(cts2$country_name))), y=freq)) +
  geom_bar(stat="identity")+ 
  scale_y_continuous(trans='sqrt', labels = scales::comma, breaks = c(100, 10000, 100000, 700000))+
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

请参阅:Using ggplot2, can I insert a break in the axis?,以获取有关如何应对如此巨大差距的一些想法。特别是,gap.barplot库中的plotrix将允许您在条形图中放置一个空白。

另一种方法建议使用一个简单的表。您可以使用grid.table库中的gridExtra来根据数据框制作漂亮的表。