我的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))
结果有两个主要问题。
stat="identity"
”或“使用因素”。好了,正如您所看到的,我都没有任何作用。关于Y比例尺,即使使用trans='sqrt'
,美国数据点也确实很难看到其余数据项之间的差异。有没有更好的可视化方法? Log2和Log10看起来都更糟。
答案 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
来根据数据框制作漂亮的表。