騰訊課堂 | Python網絡爬蟲與文本數據分析
同樣的基本作圖任務,plotnine比matplotlib和seaborn代碼量少,更美觀。所以我又重新發一遍,大家可以先收藏起來,后面總有用到的時候~
R語言的ggplot2繪圖能力超強,python雖有matplotlib,但是語法臃腫,使用復雜,入門極難,seaborn的出現稍微改善了matplotlib代碼量問題,但是定制化程度依然需要借助matplotlib,使用難度依然很大。
而且咱們經管專業學編程語言,一直有一個經久不衰的問題-“學數據分析,到底選擇R還是Python”。通過plotnine這個庫,你就可以在python世界中體驗下R語言的新奇感,體驗可視化之美,如果著迷上癮,再學R也不遲。
plotnine包,可以實現絕大多數ggplot2的繪圖功能,兩者語法十分相似,R和Python的語法轉換成本大大降低。
- plotnine文檔 https://plotnine.readthedocs.io/en/latest/
- R語言ggplot2文檔 https://ggplot2.tidyverse.org/reference/index.html
安裝
pip?install?plotnine
準備數據
from?plotnine.data?import?mpg
#dataframe
mpg.head()
manufacturer | model | displ | year | cyl | trans | drv | cty | hwy | fl | class | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | audi | a4 | 1.8 | 1999 | 4 | auto(l5) | f | 18 | 29 | p | compact |
1 | audi | a4 | 1.8 | 1999 | 4 | manual(m5) | f | 21 | 29 | p | compact |
2 | audi | a4 | 2.0 | 2008 | 4 | manual(m6) | f | 20 | 31 | p | compact |
3 | audi | a4 | 2.0 | 2008 | 4 | auto(av) | f | 21 | 30 | p | compact |
4 | audi | a4 | 2.8 | 1999 | 6 | auto(l5) | f | 16 | 26 | p | compact |
快速作圖qplot
我們先直接看最簡單好用的快速作圖函數qplot(x, y, data)
- 橫坐標displ
- 縱坐標cty
- 數據mpg
from?plotnine?import?qplot
qplot(x='displ',?
??????y='cty',
??????data=mpg)
ggplot圖層
qplot是快速作圖函數,如果想讓圖更好看,進行私人訂制,那么我們需要進行圖層設計
首先設置ggplot圖層(相當于買了一個高級畫布),
- 數據mpg
- 橫坐標x軸為displ
- 縱坐標y軸cty
在plotnine中,變量所對應的數據均可通過字段名調用
from?plotnine?import?ggplot,?geom_point,?aes
ggplot(aes(x='displ',?y='cty'),?mpg)
圖層疊加
我們可以看到,已經繪制出一個空的ggplot圖層,x軸為displ,y軸為cty。
接下來我們給這個圖層上加上數據對應的散點,使用geom_point()直接追加在ggplot圖層之上即可。
(
????ggplot(aes(x='displ',?y='cty'),?mpg)
????+?geom_point()
)
color
在上圖中,散點是沒有區分每輛車的氣缸數cyl。
在geom_point()中,我們可以按照氣缸數cyl分門別類,按照顏色顯示出來
(
????ggplot(aes(x='displ',?y='cty'),?mpg)
????+?geom_point(aes(color='cyl'))
)
上圖挺好看的,有時候需要繪制的字段是離散型數值,但是上色后可能不夠明顯,需要聲明該字段為離散型。這時候用factor()來告訴plotnine,這個字段是離散型數值
(
????ggplot(aes(x='displ',?y='cty'),?mpg)
????+?geom_point(aes(color='factor(cyl)'))?
)
size
有時候為了增加可視化顯示的維度數,還可以考慮加入點的大小size
(
????ggplot(aes(x='displ',?y='cty'),?mpg)
????+?geom_point(aes(size='hwy'))
)
梯度色
如果你想自己設置顏色的梯度,可以通過scale_color_gradient設置
from?plotnine?import?scale_color_gradient
(
????ggplot(aes(x='displ',?y='cty'),?mpg)
????+?geom_point(aes(color='hwy'))
????+?scale_color_gradient(low='blue',?high='red')
)
條形圖
plotnine中可繪制的圖有很多,剛剛已經講了散點圖,接下來我們看看plotnine中的條形圖。
首先準備一下數據
import?pandas?as?pd
df?=?pd.DataFrame({
????'variable':?['gender',?'gender',?'age',?'age',?'age',?'income',?'income',?'income',?'income'],
????'category':?['Female',?'Male',?'1-24',?'25-54',?'55+',?'Lo',?'Lo-Med',?'Med',?'High'],
????'value':?[60,?40,?50,?30,?20,?10,?25,?25,?40],
})
df['variable']?=?pd.Categorical(df['variable'],?categories=['gender',?'age',?'income'])
df['category']?=?pd.Categorical(df['category'],?categories=df['category'])
df
variable | category | value | |
---|---|---|---|
0 | gender | Female | 60 |
1 | gender | Male | 40 |
2 | age | 1-24 | 50 |
3 | age | 25-54 | 30 |
4 | age | 55+ | 20 |
5 | income | Lo | 10 |
6 | income | Lo-Med | 25 |
7 | income | Med | 25 |
8 | income | High | 40 |
from?plotnine?import?ggplot,?aes,?geom_text,?position_dodge,?geom_point
#調整文本位置
dodge_text?=?position_dodge(width=0.9)??????????????????????????????#?new
(
????ggplot(df,?aes(x='variable',?
???????????????????y='value',?
???????????????????fill='category'))?#類別填充顏色
????+?geom_col(position='dodge',?
???????????????show_legend=False)???#?modified
????+?geom_text(aes(y=-.5,?label='category'),??????????????????????????#?new
????????????????position=dodge_text,
????????????????color='gray',??#文本顏色
????????????????size=8,???#字號
????????????????angle=30,?#文本的角度
????????????????va='top')
????
?+?lims(y=(-5,?60))?????????????????????????????????????????????????#?new
)
from?plotnine.data?import?economics_long
economics_long.head()
date | variable | value | value01 | |
---|---|---|---|---|
0 | 1967-07-01 | pce | 507.4 | 0.000000 |
1 | 1967-08-01 | pce | 510.5 | 0.000266 |
2 | 1967-09-01 | pce | 516.3 | 0.000764 |
3 | 1967-10-01 | pce | 512.9 | 0.000472 |
4 | 1967-11-01 | pce | 518.1 | 0.000918 |
from?plotnine?import?ggplot,?aes,?geom_line
(
????ggplot(economics_long,?aes(x='date',?y='value01',?color='variable'))
????+?geom_line()
)
plotnine目前已經支持絕大多數ggplot2,但是文檔方面沒有ggplot2全,所以學習plotnine時可以參考ggplot2。
- plotnine文檔 https://plotnine.readthedocs.io/en/latest/
- R語言ggplot2文檔 https://ggplot2.tidyverse.org/reference/index.html
往期文章
[更新] Python網絡爬蟲與文本數據分析?rpy2庫 | 在jupyter中調用R語言代碼plydata庫 | 數據操作管道操作符>>tidytext | 耳目一新的R-style文本分析庫七夕禮物 | 全網最火的釘子繞線圖制作教程讀完本文你就了解什么是文本分析文本分析在經管領域中的應用概述??綜述:文本分析在市場營銷研究中的應用plotnine: Python版的ggplot2作圖庫小案例: Pandas的apply方法??stylecloud:簡潔易用的詞云庫?用Python繪制近20年地方財政收入變遷史視頻??Wow~70G上市公司定期報告數據集漂亮~pandas可以無縫銜接Bokeh??YelpDaset: 酒店管理類數據集10+G??
公眾號后臺回復關鍵詞【plotnine入門】即可下載本文數據代碼
“分享”和“在看”是更好的支持!