在ggplot

时间:2018-02-19 17:37:23

标签: r ggplot2

我为每个站点(与国家/地区对应)有一个计数,每个站点属于一个区域。数据如下所示:

> summary_data
     Site Count   Region
1    Chad     5   Africa
2  Angola     1   Africa
3  France    10   Europe
4     USA     6 Americas
5 Bolivia     3 Americas
6   Chile     4 Americas

我想生成一个条形图:

  • 每个国家/地区都有一个栏位
  • 条形图中的区域条形图彼此相邻
  • 每个区域,条形按降序显示
  • 这些条的宽度都相同,但高度都是相同的比例
  • 可以推广(特别是:任意区域,每个区域的任意国家)
  • 我不想用填充颜色来表示区域(我想用颜色来代表另一个特征)
  • 我希望有一些可视化表示来对列进行分组。例如,在美洲地区的所有列后面都有灰色背景,非洲地区所有列后面都有蓝色背景等。我实际上会对其他方法持开放态度(可能是跨越整个非洲的一条线,而#34;非洲和#34;作为标签或其他东西)。

显然,每个地区可以拥有不同数量的国家/地区,并且没有任何国家/地区跨越两个地区(我尝试使用分面但很快意识到这不是正确的路线)。我还尝试循环遍历所有区域,以便为每个区域生成单独的图形,然后将它们组合在一起,但这似乎也不是正确的方法。

我已经生成了一个这样的图表(我得到的最近):

enter image description here

使用此代码:

library("dplyr")
library(ggplot2)
sorted <- arrange(summary_data,Region,-Count)
sorted$Site <- factor(sorted$Site, levels = sorted$Site)
bar = ggplot(sorted,
   aes(
     x = Site,
     y = Count,
     fill = Region
   )) +  
  geom_col()
print(bar)

但是这不符合我上面设置的最后两个要求(我特别不想使用fill来表示区域)。我开始沿着geom_rect()的路径但是不了解离散x值的坐标系而不是连续的(我确实找到了连续的Stackoverflow问题/答案,但没有看到如何转换为此)。我认为在列后面设置阴影矩形可能是最好的方法,但我会欣赏一般方法中的任何输入以及如何将它拉下来。

1 个答案:

答案 0 :(得分:4)

您可以考虑为每个区域定义一个新面板,以使用facet_grid将它们分开。如果您希望颜色相同,只需删除aes(fill = Site)内的geom_bar参数。

参数space = "free_x"确保条的宽度相同,并且scale = free仅显示与特定区域对应的那些轴值。

ggplot(sorted, aes(x = Site, y = Count)) +
   geom_bar(position = "dodge", stat = "identity", aes(fill = Site)) + 
   facet_grid(. ~ Region,scale="free",  space="free_x")

enter image description here