ggplot2:在第一列之后创建一个空白的多面饼图

问题描述 投票:1回答:1

目前,我正在使用ggplot2的以下代码创建这样的图形

ggplot(data.df[sel,], aes(x=1, y = mean_ponderation_norm, fill = Usage)) +
  geom_bar(stat="identity",color='black') +
  coord_polar(theta='y')+
  scale_fill_brewer(type="qual", palette = 2, direction = 1, name="")+
  facet_grid(zone.x~Type_service)+
  theme(#panel.grid = element_blank(), ## remove guide lines
    #axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks=element_blank(),  # the axis ticks
    axis.title=element_blank()  # the axis labels
  )+
  scale_y_continuous(limits = c(0, 100))

pie chart 1

但是我希望第二列中的切片从第一列中的停止位置开始。得到这样的东西

pie chart 2

r ggplot2 pie-chart
1个回答
2
投票

使用极坐标绘制时,考虑在笛卡尔坐标中期望的效果看起来总是很有用的。您要寻找的东西在笛卡尔坐标中看起来像这样:

enter image description here

这种特殊效果几乎可以通过堆积的条形图和一些黑客手段来实现,只要您的图片具有两个方面即可。但是,您的代码建议您有4个或更多,所以这行不通。

您可以使用geom_rect获得所需的结果,而不用使用堆积的条。您没有提供任何数据,也没有提供最少的可重复示例,这有点令人失望,因为您需要转换自己的数据才能使用geom_rect。我必须创建自己的数据以显示如何完成此操作,这意味着您将必须弄清楚如何转换自己的数据以执行相同的操作。

无论如何,这是我要使用的数据。在您的数据中,mean_ponderation_norm包含y值。我要称呼我为all_widths。您需要cumsum并将其标准化。您还需要创建一个位置为1的零的滞后副本,并将其添加到数据框中:

set.seed(69)
all_widths <- runif(10, 5, 10)
all_widths <- 60 * cumsum(all_widths)/sum(all_widths)

df <- data.frame(facet_var = rep(LETTERS[1:2], each = 5),
                 factor_var = rep(LETTERS[1:10]),
                 start_var = c(0, all_widths[-length(all_widths)]),
                 end_var  = all_widths)

现在您的情节如下:

ggplot(df, aes(xmin = 0, xmax = 1, ymin = start_var, 
               ymax = end_var, fill = factor_var)) +
  geom_rect(color = 'black', size = 1) +
  coord_polar(theta = 'y') +
  facet_grid(. ~ facet_var) +
  theme(axis.text.y = element_blank(),
        axis.ticks = element_blank(), 
        axis.title = element_blank()) +
  scale_y_continuous(limits = c(0, 100)) +
  guides(fill = "none")

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.