19世纪50年代,英国、法国、土耳其和俄国进行了克里米亚战争,英国的战地战士死亡率高达42%。弗罗伦斯·南丁格尔主动申请,自愿担任战地护士。她率领38名护士抵达前线,在战地医院服务。当时的野战医院卫生条件极差,各种资源极度匮乏,她竭尽全力排除各种困难,为伤员解决必须的生活用品和食品,对他们进行认真的护理。仅仅半年左右的时间伤病员的死亡率就下降到2.2%。每个夜晚,她都手执风灯巡视,伤病员们亲切地称她为“提灯女神”。
战争结束后,南丁格尔回到英国,被人们推崇为民族英雄。
出于对资料统计的结果会不受人重视的忧虑,她发展出一种色彩缤纷的图表形式,让数据能够更加让人印象深刻。这种图表形式有时也被称作「南丁格尔的玫瑰」,是一种圆形的直方图。南丁格尔自己常昵称这类图为鸡冠花图(coxcomb),并且用以表达军医院季节性的死亡率,对象是那些不太能理解传统统计报表的公务人员。她的方法打动了当时的高层,包括军方人士和维多利亚女王本人,于是医事改良的提案才得到支持。
相对于普通的柱状图,南丁格尔玫瑰图显得更加浪漫和丰满。经过时代变迁,南丁格尔玫瑰图也得到了极大的发展,各路神仙用他们的脑洞画出了各种各样的玫瑰图,美轮美奂。 那么今天便绘制南丁格尔玫瑰图,以下是绘制成果。 首先说一下绘制思想:
我们先看下图,这个图十分的复杂,复杂就复杂在图中的点。试想一下,如果我们先绘制一个柱状图,那么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")随后会得到以下三个图
然后用修图软件将这三个图层叠加后就得到了最终图像! 铁汁们就冲这个图,我要个小心心不过分吧!