ggplot甜甜圈图 [英] ggplot Donut chart

查看:594
本文介绍了ggplot甜甜圈图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我真的很喜欢这个,没有任何喜悦。如果网站存在,我们很乐意为您提供参考。我努力去理解哈德利极坐标文档,我知道pie /甜甜圈图表被认为天生就是邪恶的。



也就是说,我想要做的是


  1. 创建一个甜甜圈/圆环图(这是一个空的中间派),像
  2. 在上面添加第二个图层圆圈(with alpha = 0.5 左右)显示第二个(可比较的)变量。

为什么呢?我正在寻找显示财务信息。第一环是成本(细分),第二环是总收入。然后,想法是在每个审查周期内添加 + facet = period ,以显示收入和支出的趋势以及两者的增长。

任何想法都将得到最多赞赏



注意:如果需要使用MWE,完全任意使用

  donut_data = iris [,2:4] 
revenue_data = iris [,1]
facet = iris $种类

这与我试图做的类似。谢谢

解决方案

我没有完整的回答你的问题,但我可以提供一些代码,可以帮助你开始使用 ggplot2

  library(ggplot2)

#创建测试数据。
dat = data.frame(count = c(10,60,30),category = c(A,B,C))

#添加列,需要使用geom_rect进行绘制。
dat $ fraction = dat $ count / sum(dat $ count)
dat = dat [order(dat $ $ fraction),]
dat $ ymax = cumsum(dat $ fraction)
dat $ ymin = c(0,head(dat $ ymax,n = -1))

p1 = ggplot(dat,aes(fill = category,ymax = ymax,ymin = ymin, ()()+
geom_rect()+
coord_polar(theta =y)+
xlim(c(0,4))+
labs (title =Basic ring plot)

p2 = ggplot(dat,aes(fill = category,ymax = ymax,ymin = ymin,xmax = 4,xmin = 3))+
)geom_rect(color =grey30)+
coord_polar(theta =y)+
xlim(c(0,4))+
theme_bw()+
theme (panel.grid = element_blank())+
theme(axis.text = element_blank())+
theme(axis.ticks = element_blank())+
labs(title =Customized戒指)


library(gridExtra)
png(ring_plots_1.png,height = 4,width = 8,units =in,res = 120)
grid.arrange(p1,p2,nrow = 1)
dev.off()



想法: >

  • 如果您发布了一些结构良好的样本数据,您可能会得到更多有用的答案。您已经提到使用 iris 数据集中的一些列(一个好的开始),但我无法看到如何使用这些数据来创建一个环形图。例如,您链接的环图显示了几个类别的比例,但是既不是>虹膜[,2:4] 也不是虹膜[,1]

  • 您想要在顶部添加第二个图层圆圈:您的意思是直接在第一个图层上叠加第二个图案圆环?或者你想让第二枚戒指在第一枚戒指内部还是外部?你可以添加第二个内部环,像 geom_rect(data = dat2,xmax = 3,xmin = 2,aes(ymax = ymax,ymin = ymin)) li>
  • 如果您的data.frame有一个名为 period 的列,您可以使用 facet_wrap(〜period)
  • 要最简单地使用 ggplot2 ,您需要以'long-form'形式存储数据。 来自 reshape2 包的 melt()可能对转换数据非常有用。
  • 即使您决定不使用它们,也可以制作一些用于比较的线条。例如,尝试:
    ggplot(dat,aes(x = category,y = count,fill = category))+
    geom_bar(stat =identity)


  • Hi I really have googled this a lot without any joy. Would be happy to get a reference to a website if it exists. I'm struggling to understand the Hadley documentation on polar coordinates and I know that pie/donut charts are considered inherently evil.

    That said, what I'm trying to do is

    1. Create a donut/ring chart (so a pie with an empty middle) like the tikz ring chart shown here
    2. Add a second layer circle on top (with alpha=0.5 or so) that shows a second (comparable) variable.

    Why? I'm looking to show financial information. The first ring is costs (broken down) and the second is total income. The idea is then to add + facet=period for each review period to show the trend in both revenues and expenses and the growth in both.

    Any thoughts would be most appreciated

    Note: Completely arbitrarily if an MWE is needed if this was tried with

    donut_data=iris[,2:4]
    revenue_data=iris[,1]
    facet=iris$Species
    

    That would be similar to what I'm trying to do.. Thanks

    解决方案

    I don't have a full answer to your question, but I can offer some code that may help get you started making ring plots using ggplot2.

    library(ggplot2)
    
    # Create test data.
    dat = data.frame(count=c(10, 60, 30), category=c("A", "B", "C"))
    
    # Add addition columns, needed for drawing with geom_rect.
    dat$fraction = dat$count / sum(dat$count)
    dat = dat[order(dat$fraction), ]
    dat$ymax = cumsum(dat$fraction)
    dat$ymin = c(0, head(dat$ymax, n=-1))
    
    p1 = ggplot(dat, aes(fill=category, ymax=ymax, ymin=ymin, xmax=4, xmin=3)) +
         geom_rect() +
         coord_polar(theta="y") +
         xlim(c(0, 4)) +
         labs(title="Basic ring plot")
    
    p2 = ggplot(dat, aes(fill=category, ymax=ymax, ymin=ymin, xmax=4, xmin=3)) +
         geom_rect(colour="grey30") +
         coord_polar(theta="y") +
         xlim(c(0, 4)) +
         theme_bw() +
         theme(panel.grid=element_blank()) +
         theme(axis.text=element_blank()) +
         theme(axis.ticks=element_blank()) +
         labs(title="Customized ring plot")
    
    
    library(gridExtra)
    png("ring_plots_1.png", height=4, width=8, units="in", res=120)
    grid.arrange(p1, p2, nrow=1)
    dev.off()
    

    Thoughts:

    1. You may get more useful answers if you post some well-structured sample data. You have mentioned using some columns from the iris dataset (a good start), but I am unable to see how to use that data to make a ring plot. For example, the ring plot you have linked to shows proportions of several categories, but neither iris[, 2:4] nor iris[, 1] are categorical.
    2. You want to "Add a second layer circle on top": Do you mean to superimpose the second ring directly on top of the first? Or do you want the second ring to be inside or outside of the first? You could add a second internal ring with something like geom_rect(data=dat2, xmax=3, xmin=2, aes(ymax=ymax, ymin=ymin))
    3. If your data.frame has a column named period, you can use facet_wrap(~ period) for facetting.
    4. To use ggplot2 most easily, you will want your data in 'long-form'; melt() from the reshape2 package may be useful for converting the data.
    5. Make some barplots for comparison, even if you decide not to use them. For example, try: ggplot(dat, aes(x=category, y=count, fill=category)) + geom_bar(stat="identity")

    这篇关于ggplot甜甜圈图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆