我正在尝试制作甜甜圈图表。
唯一的问题是他们看起来像这样......
这是我的代码
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')
如何将我的图表从奇怪的馅饼变成宽度相同的圆圈?
答案 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)
好的,这是怎么回事?让我们来看看你的代码 - 你得到一些看起来像甜甜圈但有不同孔尺寸的情节。这是为什么? 对#unpie&#39;有帮助。数据,只需将输出视为条形。(为了简单起见,我将只分组到您的方面的两行。)
ggplot(subset(diamonds, as.numeric(clarity) <=2),
aes(x = cut, fill = color)) +
geom_bar(position = 'fill', stat = 'bin') +
facet_grid(clarity ~ cut)
你有一个映射到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)]
现在绘制,在堆栈之前有一些空间
您需要的堆积条形图,您只需添加coord_polar
(如帖子顶部所做)。您可以使用x限制来根据自己的喜好调整甜甜圈/洞比例。