绘图技巧 | 议会(项目)图还不会做?快上车~~

好奇心Log 今天

以下文章来源于DataCharm ,作者宁海涛

DataCharm定期更新 数据分析、数据可视化(商业、学术图表)教程,同时也会涉及机器学习、深度学习模型的构建及应用。所用工具主要包括Python、R、Processing等。

今天这篇推文小编给大家介绍一个一直想绘制的图表-议会图(parliament diagrams),当然这也是柱形图系列变形的一种。绘制这种图表也是超级简单的,只需使用R-ggpol包进行绘制即可,当然,改包还提供其他优秀的绘图函数,下面就一起来看下吧。

  • R-ggpol包简介
  • R-ggpol包实例介绍(议会图为主)

R-ggpol包简介

  1. 官网:

https://github.com/erocoar/ggpol

  1. 绘图函数

作为ggplot2绘图系统中的一员,其安装方便(RStudio直接搜索安装即可)而且还可以通过ggplot2强大的绘图函数设计出自己的可视化作品。其提供的主要绘图函数如下:

  • geom_arcbar(): 绘制跨越180度的弧形条形图。
  • geom_parliament(): 绘制议会图(parliament diagrams),即圆弧上的圆圈,其中每个圆圈代表一个议会议员。指定了fill或color即可进行填充和颜色的映射。
  • geom_circle(): 绘制具有指定半径的圆多边形,注意和ggplot2的geom_point()区分开。
  • geom_tshighlight(): 可对绘制时间序列的图表进行突出作用,也是比较常用的绘图技巧。
  • geom_boxjitter(): 绘制了一个混合箱形图-半箱形图且带有误差线的图。

R-ggpol包实例介绍

「geom_boxjitter」:

(绘制了一个混合箱形图-半箱形图且带有误差线的图)

library(ggpol)library(tidyverse)library(ggtext)library(hrbrthemes)library(LaCroixColoR)

library(ggsci) # 使用科学系配色df <- data.frame(score = rgamma(150, 4, 1),                  gender = sample(c("M", "F"), 150, replace = TRUE),                  genotype = factor(sample(1:3, 150, replace = TRUE)))

boxjitter <- ggplot(df) +   geom_boxjitter(aes(x = genotype, y = score, fill = gender),                 jitter.shape = 21, jitter.color = NA,                  jitter.height = 0, jitter.width = 0.04,                 outlier.color = NA, errorbar.draw = TRUE) +  ggsci::scale_fill_jco() +  labs(    title = "Example of <span style='color:#D20F26'>ggpol::geom_boxjitter function</span>",    subtitle = "processed charts with <span style='color:#1A73E8'>geom_boxjitter()</span>",    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +  theme(    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",                                  size = 20, margin = margin(t = 1, b = 12)),    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),    plot.caption = element_markdown(face = 'bold',size = 12)      )
geom_boxjitter example

顺便提一下,很喜欢sci包的这个配色,特适合绘制科研图表哦~~

「geom_tshighlight」

(可对绘制时间序列的图表进行突出作用,也是比较常用的绘图技巧.)

time_hlight <- ggplot(economics, aes(x = date, y = unemploy)) +  geom_line() +  geom_tshighlight(aes(xmin = as.Date("01/01/1990", format = "%d/%m/%Y"),                        xmax = as.Date("01/01/2000", format = "%d/%m/%Y")),                       alpha = 0.01) +  labs(    title = "Example of <span style='color:#D20F26'>ggpol::geom_tshighlight function</span>",    subtitle = "processed charts with <span style='color:#1A73E8'>geom_tshighlight()</span>",    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +  hrbrthemes::theme_ft_rc(base_family = "Roboto Condensed")  +  theme(    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",                                  size = 20, margin = margin(t = 1, b = 12)),    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),    plot.caption = element_markdown(face = 'bold',size = 12)      )
geom_tshighlight example

这里使用了hrbrthemes::theme_ft_rc()主题风格(暗黑系列),也是小编较常用的主题哦~~

「geom_arcbar」

绘制跨越180度的弧形条形图。

#构建数据test_data_bt <- data.frame(  parties = factor(c("CDU", "CSU", "AfD", "FDP", "SPD",                     "Linke", "Gruene", "Fraktionslos"),                   levels = c("CDU", "CSU", "AfD", "FDP", "SPD",                              "Linke", "Gruene", "Fraktionslos")),  seats   = c(200, 46, 92, 80, 153, 69, 67, 2),  # colors  = c("black", "blue", "lightblue", "yellow", "red",  #             "purple", "green", "grey"),  stringsAsFactors = FALSE)

arcbar <- ggplot(test_data_bt) +   geom_arcbar(aes(shares = seats, r0 = 5, r1 = 10, fill = parties),              color="gray50" ,sep = 0.1) +   #scale_fill_manual(values = bt$colors) +  scale_fill_manual(values = lacroix_palette(type = "paired"))+  coord_fixed() +  # 修改图例  guides(fill=guide_legend(nrow=2,byrow=TRUE,reverse = TRUE,title=NULL))+ # theme_void(base_family = "Roboto Condensed") +  labs(    title = "Example of <span style='color:#D20F26'>ggpol::geom_arcbar function</span>",    subtitle = "processed charts with <span style='color:#1A73E8'>geom_arcbar()</span>",    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +  theme(    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",                                  size = 20, margin = margin(t = 1, b = 12)),    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),    plot.caption = element_markdown(face = 'bold',size = 12),    # 去除刻度线和网格线    axis.text.x = element_blank(),    axis.text.y = element_blank(),    panel.grid.major = element_blank(),    panel.grid.minor = element_blank(),    panel.background = element_rect(fill="#FEFBCD"),    panel.border = element_rect(fill = NA,colour = "#FEFBCD"),    plot.background = element_rect(fill="#FEFBCD",colour = "#FEFBCD"),    # 修改图例参数    legend.position = 'bottom',    legend.direction = "horizontal",    legend.spacing.y = unit(0.1,"cm"),    legend.spacing.x = unit(0.1,"cm"),    legend.key.size = unit(0.8, 'lines'),    legend.text = element_text(margin = margin(r = .5, unit = 'cm'))  )
geom_arcbar example

这里我们在hrbrthemes::theme_ipsum() 主题基础上进行了一些修改,具体代码中均有解释。

「geom_parliament」

议会(项目)图(parliament diagrams)

library(readxl)

df<-read_excel("test.xlsx")#head(df)df1<-df%>%group_by(Party)%>%summarise(Seats=sum(Seats))%>%arrange(Seats) # 简单的数据处理df1$legend <- paste0(df1$Party,"(", df1$Seats,")") # 拼接字符串

parliament <- ggplot(data = df1) +  geom_parliament(aes(seats = Seats,fill =  Party),color="black") +  scale_fill_manual(values = lacroix_palette(type = "paired"),labels=df1$legend) +  # 修改图例  guides(fill=guide_legend(nrow=3,byrow=TRUE,reverse = TRUE,title=NULL))+  # 添加描述性文字  annotate("text", x = 0, y = 0.4,            label = "Seats in the Parliament :\n 423 occupied \n 27 vacant",           colour = "gray20",size=5) +  labs(    title = "Example of <span style='color:#D20F26'>ggpol::geom_parliament function</span>",    subtitle = "processed charts with <span style='color:#1A73E8'>geom_parliament()</span>",    caption = "Visualization by <span style='color:#DD6449'>DataCharm</span>") +  hrbrthemes::theme_ipsum(base_family = "Roboto Condensed")  +  # 定制化主题  theme(    plot.title = element_markdown(hjust = 0.5,vjust = .5,color = "black",                                  size = 20, margin = margin(t = 1, b = 12)),    plot.subtitle = element_markdown(hjust = 0,vjust = .5,size=15),    plot.caption = element_markdown(face = 'bold',size = 12),    # 去除刻度线和网格线    axis.text.x = element_blank(),    axis.text.y = element_blank(),    panel.grid.major = element_blank(),    panel.grid.minor = element_blank(),    panel.background = element_rect(fill="#FEFBCD"),    panel.border = element_rect(fill = NA,colour = "#FEFBCD"),    plot.background = element_rect(fill="#FEFBCD",colour = "#FEFBCD"),    # 修改图例参数    legend.position = 'bottom',    legend.direction = "horizontal",    legend.spacing.y = unit(0.1,"cm"),    legend.spacing.x = unit(0.1,"cm"),    legend.key.size = unit(0.8, 'lines'),    legend.text = element_text(margin = margin(r = .5, unit = 'cm'))  )
geom_parliament example

到这里呢,议会(项目)图(parliament diagrams)也就绘制完成了,虽然一些交互式工具(如Highcharts)也可快速绘制,而我们的目的还是进行细节、配色的练习哦~~

总结

本期推文终于介绍了小编一直心心念念的可视化图了,同时,小伙伴们也应知道的是,善用一些优秀的主题包和颜色包,可以使你的可视化作品颜值提升的不止一个档次哦~,好了,感兴趣的小伙伴赶快去练习下吧~~

(0)

相关推荐