99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀一場用R語言打造的商務(wù)圖表視覺盛宴
一場用R語言打造的商務(wù)圖表視覺盛宴
2017-04-07
收藏

一場用R語言打造的商務(wù)圖表視覺盛宴

之前已經(jīng)模仿了挺多網(wǎng)絡(luò)上流行的高難度商務(wù)圖表案例,自覺功力有所小成,就想著趁熱打鐵,把那些剩余的還沒有被挖掘出來了的商務(wù)圖表案例全部補全。

本篇給出不等寬柱形圖案例以及MEKKO(也稱市場細(xì)分矩陣)圖案例全部四張圖的R語言代碼,作為ggplot商務(wù)圖表進階道路上的一個小小一步。

因素需要構(gòu)造自定義標(biāo)度,這里需要scale包的支持

library(ggplot2)

library(scales)

構(gòu)造不等寬柱形圖的案例數(shù)據(jù)(本案例模仿對象是劉萬祥老師的《Excel圖表之道》,感謝老師在業(yè)界的無私奉獻(xiàn)精神,給我后備愛或者留下了如此豐富的圖表案例資源,這里再次向老師致敬?。?。

mydata<-data.frame(Name=paste0("項目",1:5),Scale=c(35,30,20,10,5),ARPU=c(56,37,63,57,59))

因為本篇 所構(gòu)造的不等寬柱形圖、MEKKO矩陣圖等都是建立在四邊形(或者呈為矩陣)的基礎(chǔ)圖形之上的,即物理的二維空間中,四個點坐標(biāo)可以定位出一個四邊形,利用R語言的向量化操作,就可以同時操縱n組長度為4的向量,來批量生成矩形塊,這里的核心技巧只是在數(shù)據(jù)源中準(zhǔn)確的生成每一組向量(也即每一個矩形塊的水平軸起點、終點、垂直軸的起點、終點)。

在ggplot系統(tǒng)中,生成矩形的圖層函數(shù)是geom_rect()函數(shù),內(nèi)置四個參數(shù):

xmin\xmax\ymin\ymax

不等寬柱形圖:


#構(gòu)造矩形X軸的起點(最小點)

mydata$xmin<-0

for (i in 2:5){

mydata$xmin[i]<-sum(mydata$Scale[1:i-1])

}

#構(gòu)造矩形X軸的終點(最大點)

for (i in 1:5){

mydata$xmax[i]<-sum(mydata$Scale[1:i])

}

#構(gòu)造數(shù)據(jù)標(biāo)簽的橫坐標(biāo):

for (i in 1:5){

mydata$label[i]<-sum(mydata$Scale[1:i])-mydata$Scale[i]/2

}

定義字體:

windowsFonts(myFont = windowsFont("微軟雅黑"))

運行g(shù)gplot函數(shù):


ggplot(mydata)+

geom_rect(aes(xmin=xmin,xmax=xmax,ymin=0,ymax=ARPU,fill=Name))+

scale_fill_manual(values=c("#54576B","#BD1F12","#E8BA11","#62962A","#9B56AF"))+

geom_text(aes(x=label,y=ARPU-3,label=ARPU),size=6,col="white",family="myFont")+

geom_text(aes(x=label,y=-2.5,label=Scale),size=4,col="black",family="myFont")+

geom_text(aes(x=label,y=-5.5,label=Name),size=4,col="black",family="myFont")+

annotate("text",x=16,y=70,label="不等寬柱形圖",size=8,family="myFont")+  

annotate("text",x=14,y=64,label="這是一幅很用心的圖表",size=4,family="myFont")+ 

annotate("text",x=11,y=-9.8,label="Source:EasyCharts",size=4,family="myFont")+ 

ylim(-10,80)+

theme_nothing()

-----------------------------------------------------------------------------------------------------------

不等寬條形圖

該案例來自于本人小號數(shù)據(jù)小魔方,也曾在本平臺轉(zhuǎn)發(fā)過:

圖表案例——全球創(chuàng)新國家1000強研發(fā)投入變動趨勢

設(shè)置目錄導(dǎo)入數(shù)據(jù)

mydata<-read.csv("barchart.csv",stringsAsFactors = FALSE) 

names(mydata)[1:5]<-c("State","RD","Betw","Cumcost","class")

#構(gòu)造矩形X軸的起點(最小點)

mydata$xmin<-0

for (i in 2:nrow(mydata)){

mydata$xmin[i]<-sum(mydata$RD[1:i-1])

}

#構(gòu)造矩形X軸的終點(最大點)

for (i in 1:nrow(mydata)){

mydata$xmax[i]<-sum(mydata$RD[1:i])

}

#構(gòu)造數(shù)據(jù)標(biāo)簽的橫坐標(biāo):

for (i in 1:nrow(mydata)){

mydata$label[i]<-sum(mydata$RD[1:i])-mydata$RD[i]/2

}

mydata$class<-factor(mydata$class,levels=c("亞洲","歐洲","北美","其他地區(qū)")).

運行作圖函數(shù):

ggplot(mydata)+

geom_rect(aes(xmin=xmin,xmax=xmax,ymin=0,ymax=Betw,fill=class),col="white")+

coord_flip()+

scale_x_reverse()+

scale_y_continuous(limits=c(-.45,.7),breaks=seq(-.4,.7,.1),labels=percent_format(),position = "top")+

scale_fill_manual(values=c("#802428","#AB6661","#D1A6A1","#A89B94"))+

geom_text(aes(x=label,y=Betw/2,label=Betw),size=3,col="white",family="myFont")+

geom_text(aes(x=label,y=ifelse(Betw>0,Betw+.03,Betw-.033),label=mydata$RD),size=4,col="black",family="myFont")+

geom_text(aes(x=label,y=ifelse(Betw>0,-.07,.07),label=State),size=4,col="black",family="myFont")+

labs(title="不等寬柱形圖",subtitle="這是一幅很用心的圖表",caption="Source:EasyCharts",x="",y="")+

theme(

text=element_text(family="myFont"),

plot.title=element_text(size=18),

plot.subtitle=element_text(size=14),

plot.caption=element_text(size=10,hjust=0),

plot.background=element_blank(),

panel.background=element_blank(),

panel.grid=element_blank(),

axis.text.y=element_blank(),

axis.ticks.y=element_blank(),

legend.position=c(0.9,0.2),

axis.line.x=element_line()

)

--------------------------------------------------------------------------------------------------------

MEKKO(也稱市場細(xì)分矩陣)

該圖表同樣來源于劉老師的圖表寶典——《Excel圖表之道》

Mekko<-read.csv("Mekko.csv",stringsAsFactors = FALSE) 

Mekko$Class<-factor(Mekko$Class,order=T)

#構(gòu)造矩形(Obama)X軸的起點(最小點)

Mekko$xmin<-0

for (i in 2:nrow(Mekko)){

Mekko$xmin[i]<-sum(Mekko$percent[1:i-1])

}

#構(gòu)造矩形(Obama)X軸的終點(最大點)

for (i in 1:nrow(Mekko)){

Mekko$xmax[i]<-sum(Mekko$percent[1:i])

}

#構(gòu)造數(shù)據(jù)標(biāo)簽的橫坐標(biāo):

for (i in 1:nrow(Mekko)){

Mekko$label[i]<-sum(Mekko$percent[1:i])-Mekko$percent[i]/2

}


這里我不想重復(fù)映射兩次geom_rect()圖層函數(shù),所以從新整理了數(shù)據(jù)源,一定要記得ggplot的作圖體系中使用因子變量進行分類作圖的思想,這里完全可以用一個類別標(biāo)量賦給fill屬性,避免代碼冗余。


mynewdata1<-Mekko[,c(1,6,7)];mynewdata1$ymin<-0;mynewdata1$ymax<-Mekko$Obama;mynewdata1$Type<-"Obama"

mynewdata2<-Mekko[,c(1,6,7)];mynewdata2$ymin<-Mekko$Obama+Mekko$m;mynewdata2$ymax<-Mekko$Obama+Mekko$m+Mekko$McCain;mynewdata2$Type<-"McCain"

mynewdata<-rbind(mynewdata1,mynewdata2)

mynewdata$Type<-factor(mynewdata$Type,levels=c("Obama","McCain"),order=T)

運行作圖函數(shù):

ggplot(mynewdata)+

geom_rect(aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax,fill=Type),col="white")+

scale_fill_manual(values=c("#004C7F","#B70023"))+

scale_x_continuous(breaks=Mekko$label,labels=Mekko$Class)+

geom_text(data=Mekko,aes(x=label,y=.25,label=percent(Obama)),size=3.5,col="white",family="myFont")+

geom_text(data=Mekko,aes(x=label,y=.8,label=percent(McCain)),size=3.5,col="white",family="myFont")+

labs(title="MEKKO-市場細(xì)分矩陣圖",subtitle="這是一幅用心良苦的圖表",caption="Source:EasyCharts",x="",y="")+

theme(

plot.margin=unit(c(2,0,0.5,0),"lines"),

panel.spacing=unit(c(0,0,0,0),"lines"),

axis.text.x=element_text(angle=90,size=10),

panel.background=element_blank(),

axis.ticks=element_blank(),

axis.text.y=element_blank(),

legend.position=c(.78,1),

legend.direction="horizontal",

text=element_text(family="myFont"),

plot.title=element_text(size=18),

plot.subtitle=element_text(size=14),

plot.caption=element_text(size=10,hjust=0),

legend.title=element_blank()

)

---------------------------------------------------------------------------------------------------------

以下同樣的數(shù)據(jù)源,只是通過坐標(biāo)旋轉(zhuǎn),換成了條形圖的風(fēng)格。

ggplot(mynewdata)+

geom_rect(aes(xmin=xmin,xmax=xmax,ymin=ymin,ymax=ymax,fill=Type),col="white")+

coord_flip()+

scale_fill_manual(values=c("#004C7F","#B70023"))+

scale_x_continuous(breaks=Mekko$label,labels=Mekko$Class)+

geom_text(data=Mekko,aes(x=label,y=.25,label=percent(Obama)),size=3.5,col="white",family="myFont")+

geom_text(data=Mekko,aes(x=label,y=.8,label=percent(McCain)),size=3.5,col="white",family="myFont")+

labs(title="MEKKO-市場細(xì)分矩陣圖",subtitle="這是一幅用心良苦的圖表",caption="Source:EasyCharts",x="",y="")+

theme(

plot.margin=unit(c(0,0,0,0),"lines"),

panel.spacing=unit(c(0,0,0,0),"lines"),

axis.text.y=element_text(size=10),

panel.background=element_blank(),

axis.ticks=element_blank(),

axis.text.x=element_blank(),

legend.position=c(.78,1),

legend.direction="horizontal",

text=element_text(family="myFont"),

plot.title=element_text(size=18),

plot.subtitle=element_text(size=14),

plot.caption=element_text(size=10,hjust=0),

legend.title=element_blank()

)

因水平有限,代碼寫的比較糟糕,圖表如有可改善的細(xì)節(jié),還請的各位多多指點。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }