信息圖表高仿——R語言仿一財經典線條比較圖
今天是一個圖表高仿,對象是一財經典的半圓型線條比較圖,信息主要是針對2016年天貓全球購物狂歡節的當日總銷售額,為了使得比較效果更有針對性,作者使用了幾個中小型體量的國家GDP總量來對比,總體來看比較生動形象,引人眼球。
但是該圖製作比較複雜,之前看到過大神們用Excel來構造半圓的路徑數據進行仿製,這裡小編使用R來構造麯線數據,大體思路差不多,都是構造麯線的路徑數據,鏈接各點形成整體上的半圓線條,但是R在處理這些數據過程中,具有先天優勢,效率相對較高。
library("xlsx")library("ggplot2")library(stringr)library(showtext)library(Cairo)setwd("F:/微信公眾號/公眾號——數據小魔方/2017年3月/20170331")mydata<-read.xlsx("barpoint.xlsx",sheetName="Sheet1",header=T,encoding="UTF-8",stringsAsFactors=FALSE)m<-max(nchar(mydata$Name))mydata$Name<-str_pad(mydata$Name,44,side="right",pad=" ")
生成10個半圓線條的路徑點(水平軸X上的點,使用seq可以生成任意區間的等間隔點)數據並按順序合併。
sdd<-c()for(m in 1:nrow(mydata)){x<-seq(from=0,to=mydata$Scale[m],length=1000)sdd<-c(sdd,x)}
生成對應的ID、半徑和對應半圓的垂直軸的Y坐標點。
這是圓形曲線的方程式,高中學過的哦表忘了(我昨晚是問了我的室友才才確定是這麼寫的~_~)
曲線方程式:
x^2+Y^2=R^2Y=sqrt((R/2)^2-(X-R/2)^2)id<-rep(LETTERS[1:10],rep(1000,10))rdd<-rep(mydata$Scale,rep(1000,10))y<-sqrt((rdd/2)^2-(sdd-rdd/2)^2)
mynewdata<-data.frame(id,sdd,y)
這裡為了更加方便的,使用自動輸出方式:
font.add("myfont","msyhl.ttc")CairoPNG(file="C:/Users/Administrator/Desktop/barpoint.png",width_=1000,height=1050)showtext.begin()ggplot()+geom_path(data=mynewdata[mynewdata$id!="F",],aes(x=sdd,y=y,group=id),color="white")+geom_path(data=mynewdata[mynewdata$id=="F",],aes(x=sdd,y=y,group=id),color="#D56A55")+geom_segment(data=NULL,aes(x=0,y=0,xend=1690,yend=0),color="white",size=1)+geom_point(data=mydata,aes(x=Scale,y=0),color="White",size=3)+geom_text(data=NULL,aes(x=mydata$Scale[c(-4,-6,-8)],y=-30,label=mydata$Scale[c(-4,-6,-8)]),size=4,col="white",family="myfont")+geom_text(data=NULL,aes(x=mydata$Scale[c(4,6,8)],y=-60,label=mydata$Scale[c(4,6,8)]),size=4,col="white",family="myfont")+ylim(-70,900)+scale_x_continuous(breaks=mydata$Scale,labels=mydata$Name)+labs(title="1207億元意味著什麼?",subtitle="意味著什麼,什麼,什麼,什麼???",caption="註:圖中數據已根據中國銀行2016年11月10日發布的中間匯率美元兌換人民幣匯率
為1:6.7885進行換算",x="",y="")+theme(panel.background=element_rect(fill="black"),plot.background=element_rect(fill="black"),axis.text.x=element_text(angle=-90,colour="white",hjust=0,size=12),axis.text.y=element_blank(),panel.grid=element_blank(),axis.ticks=element_blank(),plot.margin=unit(c(1,.5,1.6,.5),"lines"),panel.spacing=unit(c(0,0,0,0),"lines"),text=element_text(family="myfont"),plot.title=element_text(size=50,colour="white",lineheight=1.2),plot.subtitle=element_text(size=35,colour="white",lineheight=1.2),plot.caption=element_text(size=25,hjust=0,colour="white"),panel.border=element_blank())showtext.end()dev.off()
---------------------
作者:EasyCharts
博客專欄:EasyCharts 博客專欄
公眾號:EasyCharts
大家也可以加小編微信:tswenqu(備註:知乎),進R語言中文社區 交流群,可以跟各位老師互相交流
官方公眾號:R語言中文社區 (ID:R_shequ) 歡迎關注,持續連載。
推薦閱讀: