1. 程式人生 > >【轉載】@Python 程式設計師,如何實現狂拽酷炫的 3D 程式設計技術?

【轉載】@Python 程式設計師,如何實現狂拽酷炫的 3D 程式設計技術?

今天給大家介紹一位美麗的姑娘。她的名字叫Pyecharts,打從我第一眼見到她後,就深深地被她迷住,並且愛上了她。

簡單說一下她的來歷:Pyecharts是一款強大的視覺化工具。百度開發了一款基於JS強大的視覺化庫Echarts,可我們在繪圖時,通常並不使用前端的技術來整理資料,而轉換資料結構又非常麻煩。Pyecharts發揮了python膠水語言的特性,可以很好地幫助我們做資料視覺化。

本文圍繞Pyecharts的使用、結果呈現和優缺點,分為以下四個部分:

640?wx_fmt=png

 

640?wx_fmt=png

從2D到3D,不一樣的效果

 

任何視覺化庫的應用都是從一張簡單的柱狀圖開始。首先匯入一份空氣質量的資料。研究下5個城市的AQI指數。

#基本柱狀圖繪製
data_1 = pd.read_excel('./20180630空氣質量指數.xlsx',sheetname=0)#讀取資料
data_1.head()

資料是這樣的:

640?wx_fmt=png

Pyecharts對於資料結構的要求非常統一簡單。把資料轉換成列表總沒錯。設定好圖表的標題、副標題、顏色等一些引數,就可以直接出圖了。

640?wx_fmt=gif

發現了pyecharts一大特性麼?圖都是可互動的!

簡單的柱狀圖顯然是不能滿足你們的,我們繼續。接下來匯入一份省會城市快餐店數量的資料。

640?wx_fmt=gif

同樣把資料放入列表中。設定圖表的一些引數,如長寬、背景顏色等,可以做縱向的堆積柱狀圖,可以把直角座標改為極座標,甚至做極座標分類堆疊柱狀圖!大家可以看看不同的圖表下,同樣的資料呈現什麼效果:

640?wx_fmt=gif

留個小思考題:大家可以嘗試用PPT製作上圖。

平面的圖,我們看了好幾個了,來個3D的吧。這裡匯入一份某公司每日銷量資料。資料結構如下,縱座標為一年的52周,橫座標為一週的7天。

640?wx_fmt=gif

這回資料結構調整略複雜,我們要給每一條資料確認空間中的位置,格式如下圖:

640?wx_fmt=png

具體轉換方式我們看下程式碼,這裡要設定的東西比較多,具體效果大家可以自己試著調整下里面的引數。

x_axis = data_3['week'].tolist()
data_3['week'] = data_3['week'].str.replace('week','').map(int)-1
data_3 = data_3.set_index('week')
y_axis = data_3.columns.tolist()
data_3.columns = range(0,7)
data_3 = data_3.stack().reset_index()
data_3.columns = ['week','day','amount']
data_3.head()

style = Style(
    title_color="#A52A2A",
    title_pos = "center",
    width=900,
    height=1100,
    background_color="#ABABAB"
)

style_3d = style.add(
    is_visualmap=True,
    visual_range=[0,120],
    visual_range_color=['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf',
                        '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026'],
    grid3d_width=200, 
    grid3d_depth=80,
    xaxis_label_textcolor='#fff',
    is_grid3d_rotate=True,
    legend_pos='right'
)

bar3d = Bar3D('全年產量情況',**style.init_style)
bar3d.add('每日產量',x_axis,y_axis,data_3.values.tolist(),**style_3d)
bar3d.render('./參考案例HTML/全年產量情況3D柱狀圖.html')
bar3d

見證奇蹟的時刻到了!

640?wx_fmt=gif

好,接著我又有一個小問題,如果我把這一根根高聳的柱子壓扁會是什麼結果呢?

這不就是我們非常熟悉的熱力圖嗎?

640?wx_fmt=gif

如果我們還想再深入的研究下銷量情況,怎麼辦呢?我取了其中第一週的資料,來畫個玫瑰圖:

640?wx_fmt=gif

或者漏斗圖:

640?wx_fmt=gif

過癮吧?!這裡給大家展示的是Pyecharts能展示的不同型別的圖表,實際應用時可以按需選擇。

 

640?wx_fmt=png

玩轉Pyecharts:層出不窮的花樣! 

 

我先製作了一個儀表盤圖用來統計我每天加班的概率:

#儀表盤
from pyecharts import Gauge
gauge = Gauge('今日加班概率')
gauge.add('', "可能性", 99.99, angle_range=[225, -45],
          scale_range=[0, 100], is_legend_show=False)
gauge.render('./參考案例HTML/今日加班概率儀表盤.html')
gauge

然後圖是這樣的,大家可以清晰看到,那醒目的四個9:

640?wx_fmt=gif

下面是一個水球圖,這個圖蠻有意思的,我們可以自己繪製圖形的形狀,不過你得先明白一個叫SVG的東東。有興趣可以檢視官網的案例。

640?wx_fmt=gif

資料可以畫成圖,文字當然也可以:

#畫畫
from pyecharts import Scatter

scatter = Scatter('學霸是畫出來的')
v1, v2 = scatter.draw('./pic.png')
scatter.add('學霸印章', v1, v2, is_random=True)
scatter.render('./參考案例HTML/學霸是畫出來的散點圖.html')

匯入圖片,看清楚了,我給你畫張散點圖!

640?wx_fmt=gif

看到不,是不是很簡單,想怎麼畫就怎麼畫!(小夥伴們表示很滿意,都覺得我畫出了他們的心聲)

640?wx_fmt=jpeg

 

640?wx_fmt=png

圖表會說話:用圖表體現趨勢變化

 

先匯入一份生產成本核算的資料,資料為每個月原料價格和產品造價。

640?wx_fmt=png

可以玩玩組合圖表:

640?wx_fmt=gif

如果有熱愛炒股的小夥伴,還可以畫K線圖:

from pyecharts import Kline
day = data_k['日期'].tolist()
v = data_k[['開盤價','收盤價','最低價','最高價']].values.tolist()
kline = Kline('上證指數K線圖', width=1900, height=800)
kline.add('日K',day, v,
          mark_point=['max'], is_datazoom_show=True)
kline.render('./參考案例HTML/上證指數K線圖.html')
kline

*K線圖需要四個引數,開盤價,收盤價,最低價,最高價

640?wx_fmt=gif

 

640?wx_fmt=png

圖表會說話:用圖表體現資料分佈關係

 

還是那份成本核算的資料,我們來研究下原料成本和生產價格之間的關係,先畫個散點圖:

640?wx_fmt=gif

似乎是線性關係,對圖表加工一下看看。

640?wx_fmt=gif

散點圖的進階版——漣漪散點圖

其實這裡的圖案有好多種,大家可以一個個去試試:'rect', 'roundRect', 'triangle', 'diamond','pin', 'arrow'。

有小夥伴會問,散點圖能不能展現空間分佈呢?

能!用一份上海餐飲資料來看:

640?wx_fmt=gif

出圖!這裡點的顏色越深代表人均價格越貴。

分析運動員的身體素質強弱:

採集了8個運動員的身材指數,畫個雷達圖:

640?wx_fmt=gif

雷達圖用的是極座標系,而我們畫的一些常規圖用的是直角座標系,那麼,是不是還有其他座標系呢?

平行座標系。以空氣質量資料為例,再新增一個自定義指示器,我們可以得到這個:

640?wx_fmt=gif

可以同時顯示城市及其空氣質量情況,方便吧!

 

640?wx_fmt=png

多樣資料視覺化:文字與地圖的展示

 

分析某篇文章中的詞頻,可以畫詞雲。看這裡:

640?wx_fmt=jpeg

from pyecharts import WordCloud
name = data_10['關鍵詞'].tolist()
value = data_10['出現頻率'].tolist()
wordcloud = WordCloud(width=1300, height=620)
wordcloud.add("", name, value, word_size_range=[20, 100])
wordcloud.render('./參考案例HTML/關鍵詞統計詞雲圖.html')
wordcloud

幾行程式碼就可以搞定。

640?wx_fmt=gif

地圖資料能做的就更多了,比如地理軌跡圖:

引用一份中國資本流動的資料,分析北上廣深的投資流向:

640?wx_fmt=gif

就可以分析北上廣深這四個城市資本流出的情況啦。

 

640?wx_fmt=png

結果呈現:你的PPT可以亮起來! 

 

Pyecharts的圖表是可以在Jupyter Notebook中直接顯示的,也可以通過render方法渲染出HTML在瀏覽器中顯示,還可以插入PPT使用:

640?wx_fmt=gif

圖表也可以嵌入在web框架中,比如Django、Flask。Pyecharts的官網就是這樣做出來的。

 

640?wx_fmt=png

我為什麼選擇Pyecharts? 

 

python有很多繪圖的庫,諸如matplotlib、seaborn、bokeh等等,但是如果讓我只選擇其中一款,pyecharts會是我的不二選擇。它有友好的中文文件和十分簡潔的操作方法,為我們的資料分析工作提供了許多便利,是值得擁有的!

當然,也不是沒有缺點,pyecharts是一款偏結果表達的視覺化庫,在統計分析視覺化上並不出彩。其次,這是一款很年輕的庫,很多功能仍在開發中,但它也給了我們無限期待,相信不久的將來,它將變得越來越強大!

作者:倪家禹,城市資料團特約撰稿人,資料分析師(Python)微專業學員,喜歡用資料探勘生活中的小祕密。對資料研究有著敏銳的洞察力,善於把複雜的問題簡單化,簡單的問題流程化。希望大家通過資料感受生活的魅力。

宣告:本文為作者投稿,版權歸其個人所有。

 

2018 中國大資料技術大會

BDTC 2018