如何在ggplot2中使用facet_grid制作圆环图?

时间:2015-11-04 20:45:19

标签: r ggplot2

我正在尝试制作甜甜圈图表。

唯一的问题是他们看起来像这样......

enter image description here

这是我的代码

ggplot(
  diamonds,
  aes(
    x = cut,
    fill = color
  )
) +
  geom_bar(
    position = 'fill',
    stat = 'bin'
  ) +
  scale_y_continuous(
    labels = percent_format()
  ) +
  facet_grid(clarity ~ cut) + 
  coord_polar(theta = 'y') 

如何将我的图表从奇怪的馅饼变成宽度相同的圆圈?

1 个答案:

答案 0 :(得分:8)

这是一个很好的整洁方式:

library(ggplot2)
library(data.table)

# get data, calculate quantities of interest
diam <- diamonds; setDT(diam) 
tabulated <- diam[, .N, by = .(cut, color, clarity)]

# plot
ggplot(tabulated, aes(x=2, y=N, fill=color)) +
  geom_bar(position = 'fill', stat = 'identity')  +
  facet_grid(clarity ~ cut) + 
  xlim(0.5, 2.5) +
  coord_polar(theta = 'y') + 
  labs(x=NULL, y=NULL)

enter image description here

好的,这是怎么回事?让我们来看看你的代码 - 你得到一些看起来像甜甜圈但有不同孔尺寸的情节。这是为什么? 对#unpie&#39;有帮助。数据,只需将输出视为条形。(为了简单起见,我将只分组到您的方面的两行。)

ggplot(subset(diamonds, as.numeric(clarity) <=2), 
       aes(x = cut, fill = color)) +
  geom_bar(position = 'fill', stat = 'bin')  +
  facet_grid(clarity ~ cut)

enter image description here

你有一个映射到X的值,它没有做任何有用的事情 - 它会偏移条形图,但是由于你正面对那个变量,每个图形中只有一堆条形图。

然而,当你添加coord_polar时,偏移X值的图显示为甜甜圈,而x = 1的图显示为馅饼,因为coord_polar,一系列堆叠的条形嵌套在彼此内部,而X = 1意味着最里面的条形线条。

因此,解决方案首先将NOT实际值映射到X.您可以为所有绘图制作X = 1,但随后您将获得所有馅饼,而不是甜甜圈。你想要的是一个堆叠的条形,在x轴上有一些空间(这将是甜甜圈洞)。你可以通过复制数据来做到这一点,所以你有两组堆叠条,然后消隐第一个堆栈。这就是我以前的答案,它有效(详见编辑历史)。

Hadley建议通过Twitter提出一个更简单的解决方案,我觉得有义务为后代发帖:调整x限制以强制x轴上的一些前导空格。

首先,计算您想要的值(我使用data.table为此):

library(data.table)
diam <- diamonds; setDT(diam)
tabulated <- diam[, .N, by = .(cut, color, clarity)]

现在绘制,在堆栈之前有一些空间

enter image description here

您需要的堆积条形图,您只需添加coord_polar(如帖子顶部所做)。您可以使用x限制来根据自己的喜好调整甜甜圈/洞比例。