数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图

19世纪50年代,英国、法国、土耳其和俄国进行了克里米亚战争,英国的战地战士死亡率高达42%。弗罗伦斯·南丁格尔主动申请,自愿担任战地护士。她率领38名护士抵达前线,在战地医院服务。当时的野战医院卫生条件极差,各种资源极度匮乏,她竭尽全力排除各种困难,为伤员解决必须的生活用品和食品,对他们进行认真的护理。仅仅半年左右的时间伤病员的死亡率就下降到2.2%。每个夜晚,她都手执风灯巡视,伤病员们亲切地称她为“提灯女神”。

战争结束后,南丁格尔回到英国,被人们推崇为民族英雄。

出于对资料统计的结果会不受人重视的忧虑,她发展出一种色彩缤纷的图表形式,让数据能够更加让人印象深刻。这种图表形式有时也被称作「南丁格尔的玫瑰」,是一种圆形的直方图。南丁格尔自己常昵称这类图为鸡冠花图(coxcomb),并且用以表达军医院季节性的死亡率,对象是那些不太能理解传统统计报表的公务人员。她的方法打动了当时的高层,包括军方人士和维多利亚女王本人,于是医事改良的提案才得到支持。

数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图_第1张图片
相对于普通的柱状图,南丁格尔玫瑰图显得更加浪漫和丰满。经过时代变迁,南丁格尔玫瑰图也得到了极大的发展,各路神仙用他们的脑洞画出了各种各样的玫瑰图,美轮美奂。
数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图_第2张图片
数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图_第3张图片
那么今天便绘制南丁格尔玫瑰图,以下是绘制成果。
数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图_第4张图片
首先说一下绘制思想:

我们先看下图,这个图十分的复杂,复杂就复杂在图中的点。试想一下,如果我们先绘制一个柱状图,那么x轴便是离散的,我们就没法绘制需要连续坐标的点。但如果我们将坐标轴设置为连续的,那么堆叠柱状图就只能通过geom_tect去画,这需要知道每一个四边形的两角的坐标,其难度之大光是想想就头皮发麻。

所以这次绘图用了图层的思想,利用离散坐标轴绘制堆叠柱状图,再重开一张画布,用连续组标轴画点和线。最后利用AI将两个图层结合形成图片!

library('ggplot2')
library('reshape2')

A = c("A","B","C","D","E","F","G","H","I","J","K")
VALUE6 =c(88,41,30,40,51,12,70,21,11,13,54)
VALUE5 = c(12,59,70,60,49,88,30,28,29,34,46)
VALUE4 = c(0,0,0,0,0,0,0,22,23,30,0)
VALUE3 = c(0,0,0,0,0,0,0,29,18,12,0)
VALUE2 = c(0,0,0,0,0,0,0,0,12,7,0)
VALUE1 = c(0,0,0,0,0,0,0,0,7,4,0)

dat = data.frame(A,VALUE1,VALUE2,VALUE3,VALUE4,VALUE5,VALUE6)

dat = melt(dat,variable.name="Sample",value.name = "Num")



ggplot(dat,aes(x=as.factor(A),y=Num,fill=Sample))+
  geom_bar(stat = "identity",width = 1)+
  scale_y_continuous(limits = c(-30,150),expand = c(0,0))+
  scale_x_discrete(expand = c(0,0))+
  theme_void()+
  theme(legend.position = "none")+
  coord_polar(theta = "x")


 seq(from=10,to=11,length.out=4)

len = 11
(cumsum(as.numeric(dat[len,7:2]) ) +c(0,cumsum(as.numeric(dat[len,7:2]) )[1:5]) )/2


x = c(0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.2,7.4,7.6,7.8,
      8.14,8.3,8.42,8.57,8.71,8.85,
      9.14,9.28,9.42,9.57,9.71,9.85,
      10.33,10.66)

y = c(70.4,32.8,24.0,32.0,40.8,9.6,56,10.5,35,63,87,5.5,25.5,49,69.5,87,96.5,
      6.5,30,53,74,92,98,
      27,77)

dat = data.frame(x=x,y=y,yend=rep(149,25),xend=x)
ggplot(dat,aes(x=x,y=y,yend=yend,xend=xend))+
  geom_point(size=1)+theme_void()+
  scale_y_continuous(limits = c(-30,150),expand = c(0,0))+
  scale_x_continuous(limits = c(0,11),expand = c(0,0))+
  theme(legend.position = "none")+
  geom_segment(size=0.1)+
  coord_polar(theta = "x")
  

dat = data.frame(x = c(0:11),xend = c(0:11),y = rep(0,12),yend = rep(100,12))
ggplot(dat,aes(x=x,y=y,yend=yend,xend=xend))+
  theme_void()+
  scale_y_continuous(limits = c(-30,150),expand = c(0,0))+
  scale_x_continuous(limits = c(0,11),expand = c(0,0))+
  geom_hline(yintercept = 101.8,size=2,color = "black")+
  geom_hline(yintercept = 104.5,size=2,color =  "grey")+
  theme(legend.position = "none")+
  geom_segment(size=0.3,color = "#000000" )+
  geom_hline(yintercept = 0,size=2,color =  "black")+
  coord_polar(theta = "x")

随后会得到以下三个图
数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图_第5张图片
数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图_第6张图片
数据可视化_科学统计图表5——ggplot绘制南丁格尔玫瑰图_第7张图片

然后用修图软件将这三个图层叠加后就得到了最终图像!
铁汁们就冲这个图,我要个小心心不过分吧!

你可能感兴趣的:(数据可视化,ggplot2,可视化)