序言
雖然上次寫了一個(gè)plotly繪圖說明的一篇文章,向大家介紹了一下plotly這個(gè)很好用的python的畫交互式圖/網(wǎng)頁的庫灌具,但時(shí)代畢竟在變化割捅,最近在我再次上plotly的官網(wǎng)準(zhǔn)備查看官方文檔的時(shí)候恩掷,竟然驚喜的發(fā)現(xiàn),plotly竟然在不知不覺中升級到了4.0的版本树灶,要知道纤怒,版本號的更迭都有其意義,像這種最大位數(shù)上的數(shù)字的變化天通,絕對是很大的一次調(diào)整泊窘。
所以作為一個(gè)plotly的attributor之一,我今天就來吹一波plotly的更新!烘豹!
正文
首先一上來的最大的改變自然是在python部分的plotly的首頁
相比于之前的首頁對不起這里找不到之前的首頁
瓜贾,最顯眼的自然就是Version 4 migration Guide。其實(shí)其實(shí)還有一個(gè)不是很顯眼携悯,但是其實(shí)后來發(fā)現(xiàn)十分十分重要的一個(gè)模塊的增加祭芦,也就是plotly Express,這個(gè)模塊后面會(huì)重點(diǎn)講到劃重點(diǎn)了劃重點(diǎn)了
憔鬼。
我們可以點(diǎn)進(jìn)去Version 4 migration Guide里面龟劲,我們就可以知道一些比較重大的變化/遷移(mirgration)。
所以在這里也可以毫不猶豫的說一聲
plotly 4.0 重點(diǎn)就是在于改變了一些原來3.X版本下的冗余逊彭,算是大刀闊斧的砍掉了一些模塊了
遷移
online版的plotly遷移到了chart-studio
中
不知道有沒有讀者在用plotly的online版的咸灿,反正我其實(shí)是沒有用的,一方面是經(jīng)常要處理的數(shù)據(jù)很大(我們單位網(wǎng)速又很抓馬)侮叮,另外一方面有時(shí)不付費(fèi)的話只能使用非常有限的儲(chǔ)存空間。而且再再加上我更喜歡寫代碼而不是交互式點(diǎn)擊的方式去畫圖悼瘾,所以online版跟我始終無緣囊榜。
但正如我上一篇里面提到的,plotly是一個(gè)跨平臺的可以兼容多種語言的工具庫亥宿,所以online版也無可厚非卸勺,一個(gè)愿打一個(gè)愿挨嘛,商品經(jīng)濟(jì)烫扼。
但是J锴蟆!映企!我每次使用import plotly
的時(shí)候真的很煩悟狱。。堰氓。為什么呢挤渐?
就是plotly的default選項(xiàng)是使用online版,所以如果你要使用offline的輸出一些圖片或者網(wǎng)頁的話双絮,要再加一層浴麻,也就是plotly.offline.plot
。當(dāng)然這也僅僅是加多幾個(gè)字的原因囤攀,所以我也一直這么使用软免,但是plotly公司會(huì)考慮到這一點(diǎn),然后把plotly這個(gè)名號全部讓給了離線版焚挠,然后把online版的代碼遷移到了chart-studio
中去膏萧,真的就很大方以及很慷慨。這里再尬吹一波plotly的抉擇,這樣子想必會(huì)有更多的開源代碼工作者愿意使用plotly作為自己的畫圖工具向抢,從而達(dá)到提高知名度的效果认境!
offline版的遷移
網(wǎng)頁中時(shí)這么說的Offline features (plotly.offline) replaced by Renderers framework & HTML export
其實(shí)有點(diǎn)令人看不懂,但大概的意思應(yīng)該是拋棄了這個(gè)模塊(雖然近幾個(gè)版本以內(nèi)應(yīng)該還在
)挟鸠,然后把輸出圖片或者網(wǎng)頁的方法直接用figure這個(gè)實(shí)例的方法來代替叉信,也就是figure.to_html
和figure.write_html
。
這個(gè)也大大提高了使用時(shí)候的便捷艘希,不用再麻煩的從plotly.io
中import
一個(gè)write_images
來輸出圖片了硼身。
不過值得吐槽的是,通過orca的服務(wù)端來做網(wǎng)頁到pdf的渲染覆享,還是有些不穩(wěn)定佳遂。但重新打開一下orca的服務(wù)器端就好了,所以也不算個(gè)大問題撒顿,所以一直也沒有被解決丑罪。 orca的介紹在這里
plotly.tools.make_subplots
遷移到plotly.subplots.make_subplots
新增了很多plotly的配色主題
新模塊plotly-Express
終于到了介紹這個(gè)全新的模塊的時(shí)候了!凤壁!這個(gè)也是我這次更新里很喜歡的一個(gè)語法糖 語法糖:特指沒有什么實(shí)質(zhì)作用吩屹,但會(huì)大幅度提高書寫的或者使用的便捷度的語法
谐鼎。
首先開頭介紹一些這是個(gè)什么袭灯,簡單的說,
plotly-Express就是通過簡單的一個(gè)
function
替使用者便捷的畫圖的模塊
同樣功能的模塊在別的繪圖庫中也非常的多凡伊,例如R中著名的ggplot
唧席,或者說python中matplotlib的著名高級庫seaborn
擦盾。(要是很多人沒聽過,質(zhì)疑這幾個(gè)著名淌哟,本作者概不負(fù)責(zé))
以下可以介紹幾個(gè)例子(例子都是出自于plotly-Express的例子迹卢,這里我只是個(gè)搬運(yùn)工和解讀的角色)
自動(dòng)化散點(diǎn)圖的顏色
import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, x="sepal_width", y="sepal_length", color="species")
fig.show()
這里導(dǎo)入了一個(gè)著名的數(shù)據(jù)集(鳶尾花),然后通過plotly.express
绞绒,也就是我這次要講到的plotly-express
進(jìn)行繪圖婶希。通過給定一個(gè)dataframe
,然后通過指定列名就可以讓該function自動(dòng)幫助你進(jìn)行繪圖蓬衡。
其中通過給color
指定列名喻杈,就可以讓plotly自動(dòng)的根據(jù)該列的值,進(jìn)行離散化的賦予顏色和組別狰晚。如果是原來的寫法筒饰,就得按照下面這么寫。
import plotly.graph_objects as go
fig = go.Figure()
for group in set(iris.loc[:,"species"]):
sub_df = iris.loc[iris.loc[:,"species"==group],:]
fig.add_scatter(x=sub_df.loc[:,"sepal_width"], y=sub_df.loc[:,"sepal_length"], name = group)
plotly.offline.iplot(fig)
并且壁晒,如果要指定顏色瓷们,還得自己辛苦的在循環(huán)中手動(dòng)的去賦值,就很麻煩。但是現(xiàn)在的方法就簡單了不少谬晕。
當(dāng)然也帶來了一些麻煩(畢竟麻煩和便利總是形影相隨的)碘裕,例如如果你的
species
的列是連續(xù)值,但它其實(shí)是離散的類別變量攒钳,那么首先你得手動(dòng)的把該列轉(zhuǎn)換為字符串帮孔。而不是整數(shù)/浮點(diǎn)數(shù)。
自動(dòng)化散點(diǎn)圖的左右常用子圖
上面的例子其實(shí)也沒有簡化太多不撑,但是這個(gè)例子就簡單了很多文兢。而且似乎也很經(jīng)常需要畫類似的圖。
import plotly.express as px
iris = px.data.iris()
fig = px.scatter(iris, x="sepal_width", y="sepal_length", color="species", marginal_y="violin",
marginal_x="box", trendline="ols")
fig.show()
同樣地焕檬,這里用的是鳶尾花的數(shù)據(jù)集姆坚。除了再次自動(dòng)賦予color
以外,例子中還有兩個(gè)特別的參數(shù)marginal_x
和marginal_y
实愚。而且傳遞給它們的值也很奇怪兼呵,任何一個(gè)都不屬于鳶尾花數(shù)據(jù)集中的列名,讓我們先看看效果吧爆侣。
效果如上萍程,就是一個(gè)經(jīng)常使用的一個(gè)散點(diǎn)圖外加兩個(gè)子圖,并且這兩個(gè)子圖的布局要與左下角的散點(diǎn)圖保持很多的一致兔仰,例如共享x軸(上),共享y軸(右)蕉鸳,而且還得在右上角保留一個(gè)小小的空白區(qū)域乎赴。
所以如果要畫一個(gè)上面效果的圖,要寫的代碼量還是挺多的潮尝。
但使用plotly.express
就很好的增添了這么一個(gè)語法糖的模塊榕吼,從而讓畫這樣的圖大大輕松。
ps:就算這個(gè)圖在繪制的過程中出了點(diǎn)bug勉失,但是這個(gè)構(gòu)建好的圖的
layout
也可以利用起來羹蚣,可以把數(shù)據(jù)都刪掉,然后通過指定layout的方式重新再一個(gè)布局好的圖上進(jìn)行繪圖乱凿。
自動(dòng)化的pairwise散點(diǎn)圖
同上的顽素,直接看代碼吧
import plotly.express as px
iris = px.data.iris()
fig = px.scatter_matrix(iris, dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"], color="species")
fig.show()
這種pairwise的散點(diǎn)圖之前在plotly上畫起來也非常的困難,但其實(shí)在別的繪圖模塊里就比較常見徒蟆。
例如seaborn
的Scatterplot Matrix
或者說基于ggplot
的ggpairs
自動(dòng)化的Sankey 圖
接下來一個(gè)也是比較喜歡的一個(gè)圖胁出,因?yàn)樵?jīng)為了畫這么一個(gè)圖就辛苦的看文檔然后糾結(jié)了很久。
import plotly.express as px
tips = px.data.tips()
fig = px.parallel_categories(tips, color="size", color_continuous_scale=px.colors.sequential.Inferno)
fig.show()
但通過這么簡單的一個(gè)px.parallel_categories
就可以簡單的在一堆通過多個(gè)分類變量描述的樣本中段审,用一個(gè)sankey plot去把分類變量之間的關(guān)系描述清楚全蝶。
添加動(dòng)畫控制(animation)
import plotly.express as px
gapminder = px.data.gapminder()
fig = px.scatter(gapminder, x="gdpPercap", y="lifeExp", animation_frame="year", animation_group="country",
size="pop", color="continent", hover_name="country", facet_col="continent",
log_x=True, size_max=45, range_x=[100,100000], range_y=[25,90])
fig.show()
交互式的網(wǎng)頁的其中一個(gè)好處就是可以使用動(dòng)畫animation,但是plotly中的動(dòng)畫控制對于初學(xué)者來說就常常十分難以理解,我自己如非必要也不會(huì)去寫這么一個(gè)動(dòng)畫控制抑淫,因?yàn)榫头浅5碾y寫绷落。雖然寫好了以后也很難展示 因?yàn)楹茈y給別人一個(gè)網(wǎng)頁的結(jié)果
,但從交流/展示上來說始苇,就會(huì)非常的有意思砌烁。
- 由于簡書還不支持嵌入js,所以以下圖只是靜態(tài)圖埂蕊,建議到鏈接去看一下效果(:з」∠)
以上代碼中通過animation_frame
來初始化了一個(gè)slider從而達(dá)到了一個(gè)往弓,拖動(dòng)進(jìn)度條就可以觀察到不同年份的數(shù)據(jù)散點(diǎn)圖的效果。
結(jié)語
數(shù)據(jù)可視化是個(gè)非常非常重要的展示的能力蓄氧,數(shù)據(jù)往往只是一堆雜亂無章的數(shù)字函似,只有有效的組織、排序喉童,才能把原來雜亂無章的數(shù)據(jù)撇寞,有序的很好的展現(xiàn)出來。而只有讓別人看懂你的數(shù)據(jù)堂氯,才能讓別人理解你的數(shù)據(jù)蔑担,所以可視化,非常非常重要咽白,別人完全不知道你的數(shù)據(jù)的由來啤握、設(shè)計(jì)、前因后果晶框,所以企圖讓一個(gè)別人理解你的數(shù)據(jù)排抬,只有好的可視化才能達(dá)到。
大家一起來學(xué)習(xí)可視化鴨~~~
下面的鏈接也放一些我收藏的對學(xué)習(xí)可視化很有幫助的網(wǎng)頁授段。
參考鏈接
plotly 新增模塊express
VisuAlgo - visualising data structures and algorithms through animation算法可視化
Visualizing Network Graphs — Bokeh 1.2.0 documentation
D3 / Observable
自定義地圖 | 高德地圖API