恭喜Running Man10周年,Keep Running!
- 起因
- 安裝
-
- pip指令
- 相關連結
- 上手
-
- 散點圖
- 折線圖
- 條形圖
- 散點矩陣
- 平行坐标圖
- 直方圖
- 箱型圖
- 小提琴圖
- 其他圖
- 進階 - update
起因
早上逛公衆号看到有個庫
plotly
做可視化很厲害,早上閑來無事就研究下,後面發現還要新增賬號,直接勸退,結果被我找到他的一個進階封裝庫叫
plotly_express
,也有神器的名号,那就這個吧~
安裝
pip指令
pip install plotly_express
相關連結
參考博文
https://www.jianshu.com/p/41735ecd3f75
https://www.jianshu.com/p/44416202aafb
http://liyangbit.com/pythonvisualization/Plotly-Express-introduction-cn/
官方文檔
https://plotly.com/python/plotly-express/
上手
散點圖
一個最簡單的散點圖實作:
import plotly_express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species")
fig.show()
用的資料源是内置且很常見的鸢尾花資料集,效果長這樣:
在此基礎上,可以通過添加更多的關鍵字參數來豐富圖像的内容。
trendline
參數可以添加預測的趨勢線,現在可選的值有兩個
ols
和
lowess
,前者是線性的最小二乘回歸模型,後者是非線性的局部權重回歸模型,具體算法我也不明,反正一個用于線性一個用于非線性呗。
template
就不用多贅述了吧,可選值有這些
["plotly", "plotly_white", "plotly_dark", "ggplot2", "seaborn", "simple_white", "none"]
,選自己喜歡的就好。
error_x
和
error_y
代表了誤差線,傳入值跟
x y
參數一樣都是資料源的列名,是以需要先在
DF
上面計算出來。
marginal_x
和
marginal_y
看效果是在添加一個水準/垂直方向的子圖,可選項有這些
rug(細條)、box(箱圖)、violin(小提琴圖)、histogram(直方圖)
。
還有很多牛逼的參數像
animation_frame
和
facet_col
這些你可以通過
help(px.scatter)
一一查詢,每個參數都介紹得挺清楚的,要是有中文翻譯就好了嗚嗚。
他官網上面最終的散點圖長這樣:
import plotly_express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", marginal_y="violin",
marginal_x="box", trendline="ols", template="simple_white")
fig.show()
折線圖
import plotly_express as px
import numpy as np
t = np.linspace(0, 2*np.pi, 100)
fig = px.line(x=t, y=np.cos(t), labels={'x':'t', 'y':'cos(t)'})
fig.show()
import plotly_express as px
df = px.data.gapminder().query("continent == 'Oceania'")
fig = px.line(df, x='year', y='lifeExp', color='country')
fig.show()
如果你想要折線圖能夠圓滑一點,就不是那種尖尖,可以設定這兩個參數
render_mode="svg"
和
line_shape="spline"
,像這樣:
px.line(gapminder, x="year", y="lifeExp", color="continent",
line_group="country", hover_name="country",
line_shape="spline", render_mode="svg")
條形圖
import plotly_express as px
data_canada = px.data.gapminder().query("country == 'Canada'")
fig = px.bar(data_canada, x='year', y='pop')
fig.show()
如果很多行資料在x軸次元上擁有同樣的值,矩形會預設地一個一個堆疊起來,更改參數
barmode
即可。添加
facet_row
和
facet_col
參數産生多面的子圖:
import plotly_express as px
fig = px.bar(df, x="sex", y="total_bill", color="smoker", barmode="group",
facet_row="time", facet_col="day",
category_orders={"day": ["Thur", "Fri", "Sat", "Sun"],
"time": ["Lunch", "Dinner"]})
fig.show()
散點矩陣
import plotly_express as px
df = px.data.iris()
fig = px.scatter_matrix(df, dimensions=["sepal_width", "sepal_length", "petal_width", "petal_length"], color="species")
fig.show()
可以通過
fig.update_traces(diagonal_visible=False)
把對角線的子圖隐藏掉。
平行坐标圖
import plotly_express as px
df = px.data.iris()
fig = px.parallel_coordinates(df, color="species_id", labels={"species_id": "Species",
"sepal_width": "Sepal Width", "sepal_length": "Sepal Length",
"petal_width": "Petal Width", "petal_length": "Petal Length", },
color_continuous_scale=px.colors.diverging.Tealrose, color_continuous_midpoint=2)
fig.show()
看起來很進階的樣子,不知道哪裡能用得到。
直方圖
px.histogram(tips, x="total_bill", y="tip", color="sex", marginal="rug", histfunc="avg",
hover_data=tips.columns)
特别一點的參數有
histfunc
,預設值是
count
,可選值有
count/sum/avg/min/max
。
histnorm
預設為 None,不對資料做任何處理,可選值有
percent/probability/density/probability density
,前兩個算出占比,後兩個算密度。
箱型圖
箱型圖的
boxmode
預設值就是
group
,不像直方圖和條形圖,
notched
參數代表了圖像有沒有缺口
小提琴圖
px.violin(tips, y="tip", x="smoker", color="sex", box=True, points="all",
hover_data=tips.columns)
小提琴圖和箱型圖的組合總是讓人不忍直視,是以沒圖。
其他圖
還有很多圖就稍微提一下,用的沒上面多。三元散點圖(scatter_ternary)、三元線條圖(line_ternary)、三維散點圖(scatter_3d)、極坐标散點圖(scatter_polar)、極坐标線條圖(line_polar)、極坐标條形圖(bar_polar)、地理坐标散點圖(scatter_geo)、地理坐标線條圖(line_geo)、等高值區域地圖(choropleth)等。
進階 - update
Plotly_express 的輸出,繼承自 Plotly.py 的 Figure 類 ExpressFigure 的對象,這意味着可以使用任何 Figure 的通路器和方法,來改變 px 生成的圖表,通常借助于 .update() 函數來調用。
update的用法可太多了,下面列舉一下我用過的,以後慢慢補充吧:
# 對y軸的資料做升序排列,配合animation_frame可以做一個簡陋的動畫,對每一幀都排序。
fig.update_yaxes(categoryorder='total ascending')
# 設定y軸上字型的大小和角度
fig.update_yaxes(tickfont=dict(size=15),tickangle=-45)
# 設定條形圖text的樣式和位置(預設是在裡面)
fig.update_traces(texttemplate='%{text:.2s}', textposition='outside')
# 設定标題
fig.update_layout(barmode='relative',title='asd')