分享

饼图版气泡图

 萌小芊 2017-12-11

听说你也在画dotplot,但是我不服!》一般说的气泡图,其实只是搞大点的o 点图,不知道怎么搞大点的话,请戳《搞大你的点,让我们画真正的气泡图》。这里要讲的点,不再是单纯的点,它其实可以是任意图形。


在《ggimage:ggplot2中愉快地使用图片》一文中,我展示了「嵌套式绘图」,中间生成了多个饼图,再用这些产生的饼图用于做图,绘制出饼图版的气泡图:

当时还通过每次只画一个州的数据,来演示制作动图:

大家应该对下面Hans Rosling的动态气泡图不陌生,这其实是我在对Hans Rosling致敬。

ggimage包对这种图中套图的做法,不需要中间产生图片也是可以完成的。因为我们有geom_subview图层,直接可以操作ggplot对象。

首先我们载入所需的包,并读入数据:

library(gtable)
library(ggplot2)
library(tidyr)
library(tibble)
library(ggimage)
library(ggrepel)crime <->'http://datasets./crimeRatesByState2005.tsv',                  header=TRUE, sep='\t', stringsAsFactors=F)


定义一个plot_pie函数,用于画饼图,并返回ggplot对象。将这一函数应用于crime数据每一行,并把图对象又存回crime中。

plot_pie <->function(i) {    df <- gather(crime[i,],="" type,="" value,="" murder:motor_vehicle_theft)=""  =""  ggplot(df,="" aes(x="">1, value,fill=type)) +        geom_col() + coord_polar(theta = 'y') +        ggtitle(crime[i, 'state']) +        theme_void() + theme_transparent() +        theme(legend.position = 'none',              plot.title = element_text(size=rel(6), hjust=0.5))}crime <- as_data_frame(crime)crime$pie=""><->1:nrow(crime), plot_pie)

我们根据人口,按照比例来计算饼图的大小,并且抽离出饼图的图例:

radius <- sqrt(crime$population="" pi)radius=""><- radius/max(radius)crime$width=""><- diff(range(crime$murder))="" *="">0.2 * radiuscrime$height <- diff(range(crime$robbery))="" *="">0.2 * radiusleg1 <- gtable_filter(=""  =""  ggplot_gtable(=""  =""  =""  ="">1) + theme(legend.position='right'))    ), 'guide-box')

最后是出图,用geom_subview加图例,再用geom_subview加饼图,最后加geom_text_repel图层,写上州名。

p <- ggplot(crime,="" aes(murder,="" robbery))="" +="" geom_subview(leg1,="" x="">10, y=50) +    geom_subview(subview=crime$pie, x=crime$murder, y=crime$Robbery,
                width=crime$width, height=crime$height) +    geom_text_repel(aes(label=state))ggsave(p, file='bubble_pie.png')

ggimage系列

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多