手把手教你用plotly繪制excel中常見(jiàn)的16種圖表(上)
大家好,我是老表~
最近不是在學(xué)習(xí)plotly嘛,為了方便理解,我們這里取excel繪圖中常見(jiàn)的16種圖表為例,分兩期演示這些基礎(chǔ)圖表怎么用plotly進(jìn)行繪制!
-
第一部分:柱狀圖、條形圖、折線圖、面積圖、餅圖與圓環(huán)圖、散點(diǎn)圖、氣泡圖和極坐標(biāo)(雷達(dá)圖) -
第二部分:樹(shù)狀圖、旭日?qǐng)D、直方圖、箱線圖、瀑布圖、漏斗圖、股價(jià)圖和地圖
今天,我們介紹第一部分8類(lèi)圖表的繪制。文末有全部演示代碼ipynb文件獲取方式。
目錄:
0. 準(zhǔn)備工作
1. 柱狀圖
2. 條形圖
3. 折線圖
4. 面積圖
5. 餅圖與圓環(huán)圖
6. 散點(diǎn)圖
7. 氣泡圖
8. 極坐標(biāo)(雷達(dá)圖)
0. 準(zhǔn)備工作
我這邊是在jupyterlab中演示的plotly圖表,如果只安裝plotly是無(wú)法正常顯示圖表的(會(huì)顯示為空白),我們需要進(jìn)行以下準(zhǔn)備(以下命令均在cmd下操作即可):
# 安裝plotly庫(kù)及plotly-orca庫(kù)
pip install plotly
pip install plotly plotly-orca
# Basic JupyterLab renderer support
jupyter labextension install jupyterlab-plotly
# OPTIONAL: Jupyter widgets extension for FigureWidget support
jupyter labextension install @jupyter-widgets/jupyterlab-manager plotlywidget
參考:https://github.com/plotly/plotly.py
plotly有兩種繪圖方式,其一是原始graph_objects,其二是Plotly Express。我們這里用到的是后者,至于其中的區(qū)別,大概就是后者是高級(jí)版本,封裝了很多后者的復(fù)雜操作,可以直接用pandas.Dataframe類(lèi)型,是現(xiàn)在主推的。
1. 柱狀圖
我們知道,在excel插入圖表的時(shí)候,柱狀圖一般可選堆疊柱狀圖和簇狀柱狀圖。
柱狀圖:
# 自帶數(shù)據(jù)集 gapminder
data = px.data.gapminder()
data.head()
# 柱狀圖
import plotly.express as px
data_canada = px.data.gapminder().query("country == 'Canada'")
fig = px.bar(
data_canada, # 數(shù)據(jù)集
x='year', # x軸
y='pop', # y軸
)
fig.show()
堆疊柱狀圖:
# 自帶數(shù)據(jù)集 medals_long(長(zhǎng)表數(shù)據(jù))
long_df = px.data.medals_long()
long_df.head()
# 堆疊柱狀圖 (使用長(zhǎng)表數(shù)據(jù),這種數(shù)據(jù)excel無(wú)法直接繪制堆疊圖)
import plotly.express as px
long_df = px.data.medals_long()
fig = px.bar(
long_df, # 數(shù)據(jù)集
x="nation", # x軸
y="count", # y軸
color="medal", # 圖例顏色(這種情況下需要設(shè)定該參數(shù)根據(jù)medal類(lèi)型才區(qū)分,否則同色)
title="堆疊柱狀圖 Long-Form Input", # 圖表標(biāo)題
)
fig.show()
# 自帶數(shù)據(jù)集 medals_long(寬表數(shù)據(jù))
wide_df = px.data.medals_wide()
wide_df.head()
# 堆疊柱狀圖 (使用長(zhǎng)表數(shù)據(jù),這種數(shù)據(jù)excel可以直接繪制堆疊圖)
import plotly.express as px
wide_df = px.data.medals_wide()
fig = px.bar(wide_df, x="nation",
y=["gold", "silver", "bronze"],
title="堆疊柱狀圖 Wide-Form Input")
fig.show()
**簇狀柱狀圖 **:
# 簇狀柱狀圖
import plotly.express as px
long_df = px.data.medals_long()
fig = px.bar(
long_df,
x="nation",
y="count",
color="medal",
title="簇狀柱狀圖 Long-Form Input",
barmode='group', # barmode 設(shè)置為 group則為簇狀柱形圖,可選 stack(疊加)、group(并列)、overlay(覆蓋)、relative(相對(duì))
)
fig.show()
類(lèi)似于excel里柱狀圖填充色中依據(jù)數(shù)據(jù)點(diǎn)著色:
# 類(lèi)似于excel里柱狀圖填充色中依據(jù)數(shù)據(jù)點(diǎn)著色
import plotly.express as px
data = px.data.gapminder()
data_canada = data[data.country == 'Canada']
fig = px.bar(data_canada, x='year', y='pop',
hover_data=['lifeExp', 'gdpPercap'],
color='lifeExp', # 指定柱狀圖顏色根據(jù) lifeExp字段數(shù)值大小自動(dòng)著色
labels={'pop':'population of Canada'},
height=400, # 圖表高度
)
fig.show()
2. 條形圖
條形圖其實(shí)就是柱狀圖轉(zhuǎn)個(gè)90度,橫著顯示唄。所以,本質(zhì)上是一樣的,唯一的區(qū)別:在 Bar 函數(shù)中設(shè)置orientation='h',其余參數(shù)與柱狀圖相同。
# 在plotly繪圖中,條形圖與柱狀圖唯一的區(qū)別:在 Bar 函數(shù)中設(shè)置orientation='h',其余參數(shù)與柱狀圖相同
import plotly.express as px
data = px.data.gapminder()
data_canada = data[data.country == 'Canada']
fig = px.bar(data_canada, y='year', x='pop',
hover_data=['lifeExp', 'gdpPercap'],
color='lifeExp', # 指定柱狀圖顏色根據(jù) lifeExp字段數(shù)值大小自動(dòng)著色
labels={'pop':'population of Canada'},
height=600, # 圖表高度
width=800, # 圖表寬度
orientation='h' # 條形圖設(shè)置參數(shù)
)
fig.show()
3. 折線圖
折線圖大致可以是畫(huà)一個(gè)折線圖或多條折線圖。
單個(gè)折線圖:
# 折線圖
import plotly.express as px
df = px.data.gapminder().query("country=='Canada'")
fig = px.line(df, x="year", y="lifeExp", title='Life expectancy in Canada',
text='lifeExp', # 數(shù)據(jù)點(diǎn)顯示值
line_shape='linear', # 共有6種插值方式:'linear'、'spline'、'hv'、'vh'、'hvh'和'vhv。
)
fig.update_traces(
texttemplate='%{text:.2f}', # 數(shù)據(jù)點(diǎn)顯示值的格式
textposition='top center', # 數(shù)據(jù)點(diǎn)顯示的位置:'top left', 'top center', 'top right', 'middle left','middle center', 'middle right', 'bottom left', 'bottom center', 'bottom right'
)
fig.show()
多折線圖:
# 多折線圖
import plotly.express as px
# 比如繪制大洋洲(有澳大利亞和新西蘭)
df = px.data.gapminder().query("continent=='Oceania'")
fig = px.line(df, x="year", y="lifeExp",
color='country', # 按照國(guó)家區(qū)分
)
fig.show()
分組多折線圖:
# 分組多折線圖
import plotly.express as px
# 繪制各大洲每個(gè)國(guó)家人均壽命隨著時(shí)間變化曲線
df = px.data.gapminder().query("continent != 'Asia'") # remove Asia for visibility
fig = px.line(df, x="year", y="lifeExp",
color="continent",
line_group="country",
hover_name="country")
fig.show()
4. 面積圖
import plotly.express as px
# 比如繪制大洋洲(有澳大利亞和新西蘭)
df = px.data.gapminder().query("continent=='Oceania'")
fig = px.area(df, x="year", y="pop",
color='country', # 按照國(guó)家區(qū)分
)
fig.show()
5. 餅圖與圓環(huán)圖
我們?cè)谟胑xcel繪制餅圖的時(shí)候,可以選擇既定配色方案,還可以自定義每個(gè)色塊的顏色。用plotly繪制的時(shí)候,這些自定義操作也是支持的。
# 餅圖
import plotly.express as px
# 篩選2007年歐洲數(shù)據(jù)
df = px.data.gapminder().query("year == 2007").query("continent == 'Europe'")
# 將小于200萬(wàn)的國(guó)家標(biāo)記為其他
df.loc[df['pop'] < 2.e6, 'country'] = 'Other countries'
# 繪制餅圖
fig = px.pie(df, values='pop', names='country', title='Population of European continent')
fig.show()
字段多條數(shù)據(jù)自動(dòng)處理:
# 自帶數(shù)據(jù)集 tips,字段day下是星期,存在多條
df = px.data.tips()
df.head()
我們可以看到,在tips數(shù)據(jù)集中,day字段是星期,包含很多同星期的數(shù)據(jù)。在進(jìn)行餅圖繪制的時(shí)候,以day字段做分類(lèi),可以自動(dòng)實(shí)際聚合求和操作。
# 如果 分類(lèi) 標(biāo)簽下有很多數(shù)據(jù),則會(huì)自動(dòng)進(jìn)行分組求和
import plotly.express as px
# This dataframe has 244 lines, but 4 distinct values for `day`
df = px.data.tips()
fig = px.pie(df, values='tip', names='day')
fig.show()
設(shè)置配色方案:
關(guān)于配色方案的更多選擇,大家可以參考《我又用Python爬取了4000+股票數(shù)據(jù),并用plotly繪制了樹(shù)狀熱力圖(treemap)》里介紹的內(nèi)容。
# 設(shè)置配色方案
import plotly.express as px
df = px.data.tips()
fig = px.pie(df, values='tip', names='day',
color_discrete_sequence=px.colors.sequential.RdBu, # 設(shè)置配色方案
)
fig.show()
我們也可以自定義每個(gè)色塊顏色:
# 自定義配色
import plotly.express as px
df = px.data.tips()
fig = px.pie(df, values='tip', names='day', color='day',
color_discrete_map={'Thur':'lightcyan',
'Fri':'cyan',
'Sat':'royalblue',
'Sun':'darkblue'})
fig.show()
在餅圖上顯示數(shù)據(jù)標(biāo)簽:
# 在餅圖上顯示數(shù)據(jù)標(biāo)簽
import plotly.express as px
df = px.data.gapminder().query("year == 2007").query("continent == 'Asia'")
fig = px.pie(df, values='pop', names='country',
title='Population of American continent',
hover_data=['lifeExp'],
labels={'lifeExp':'life expectancy'}
)
fig.update_traces(textposition='inside',
textinfo='percent+label' # 數(shù)據(jù)標(biāo)簽顯示的內(nèi)容
)
fig.show()
圓環(huán)圖:
圓環(huán)圖是指餅圖中間一定半徑的圓部分為空白,設(shè)置參數(shù)hole=int即可(0-1)。
# 圓環(huán)圖
import plotly.express as px
df = px.data.tips()
fig = px.pie(df, values='tip', names='day',
color_discrete_sequence=px.colors.sequential.RdBu,
hole=.3, # 設(shè)置空心半徑比例
)
fig.show()
6. 散點(diǎn)圖
散點(diǎn)圖是x和y均為數(shù)字列表情況下的坐標(biāo)點(diǎn)圖。
x軸和y軸均是列表的形式:
# x軸和y軸均是列表的形式
import plotly.express as px
fig = px.scatter(x=[0, 1, 2, 3, 4], y=[0, 1, 4, 9, 16])
fig.show()
給定pd.Dataframe類(lèi)型數(shù)據(jù):
# 自帶數(shù)據(jù)集 iris
df = px.data.iris()
df.head()
# 設(shè)置數(shù)據(jù)點(diǎn)顏色和大小
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length",
color="species", # 根據(jù)species字段區(qū)分顏色
size='petal_length', # 根據(jù)sepal_length設(shè)置大小
hover_data=['petal_width'],
)
fig.show()
做個(gè)三角函數(shù)的圖:
import plotly.express as px
import numpy as np
t = np.linspace(0, 2*np.pi, 100)
fig = px.scatter(x=t, y=np.cos(t), labels={'x':'t', 'y':'cos(t)'})
fig.show()
7. 氣泡圖
# 氣泡圖
import plotly.express as px
df = px.data.gapminder()
fig = px.scatter(df.query("year==2007"), x="gdpPercap", y="lifeExp",
size="pop", # 設(shè)置氣泡大小依據(jù)字段pop
color="continent",
hover_name="country",
log_x=True,
size_max=60, #設(shè)置最大氣泡
)
fig.show()
8. 極坐標(biāo)(雷達(dá)圖)
極坐標(biāo)下,可以用點(diǎn)或線進(jìn)行構(gòu)圖,繪制點(diǎn)則用px.scatter_polar,繪制線則用px.line_polar。
# 自帶數(shù)據(jù)集 wind
df = px.data.wind()
df.head()
import plotly.express as px
df = px.data.wind()
fig = px.scatter_polar(df,
r="frequency", # 半徑
theta="direction", # 類(lèi)型
)
fig.show()
著色和分組標(biāo)識(shí):
import plotly.express as px
df = px.data.wind()
fig = px.scatter_polar(df, r="frequency", theta="direction",
color="strength", # 顏色根據(jù)strength著色
symbol="strength", # 符號(hào)根據(jù)strength區(qū)分
size="frequency", # 大小根據(jù) frequency 區(qū)分
color_discrete_sequence=px.colors.sequential.Plasma_r, # 設(shè)置配色方案
)
fig.show()
雷達(dá)圖:
# 雷達(dá)圖
import plotly.express as px
df = px.data.wind()
fig = px.line_polar(df, r="frequency",
theta="direction",
color="strength",
line_close=True, # 線條是否閉環(huán)
color_discrete_sequence=px.colors.sequential.Plasma_r,
template="plotly_dark", # 主題模板
)
fig.show()
扇形區(qū)域圖:
# 扇形圖區(qū)域
import plotly.express as px
fig = px.scatter_polar(r=range(0,90,10), theta=range(0,90,10),
range_theta=[0,90], # 設(shè)定區(qū)域
start_angle=0,
direction="counterclockwise", # 方位:'counterclockwise' 逆時(shí)針 ,'clockwise'順時(shí)針
)
fig.show()
本文相關(guān)源碼獲取方式:掃下方二維碼,回復(fù):ploty即可獲取
掃碼回復(fù):2021
獲取最新學(xué)習(xí)資源

推薦大家關(guān)注兩個(gè)公號(hào)
分享程序員生活、互聯(lián)網(wǎng)資訊、理財(cái)復(fù)盤(pán)日記等
專(zhuān)注于Java學(xué)習(xí)分享,從零和你一起學(xué)Java
關(guān)注后回復(fù)【1024】
送上獨(dú)家資料
◆◆◆
歡迎大家圍觀朋友圈,我的微信:pythonbrief
學(xué)習(xí)更多:
整理了我開(kāi)始分享學(xué)習(xí)筆記到現(xiàn)在超過(guò)250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲(chóng)、機(jī)器學(xué)習(xí)等方面,別再說(shuō)不知道該從哪開(kāi)始,實(shí)戰(zhàn)哪里找了
“點(diǎn)贊”傳統(tǒng)美德不能丟 
本文相關(guān)源碼獲取方式:掃下方二維碼,回復(fù):ploty即可獲取
掃碼回復(fù):2021
獲取最新學(xué)習(xí)資源

推薦大家關(guān)注兩個(gè)公號(hào)
學(xué)習(xí)更多: 整理了我開(kāi)始分享學(xué)習(xí)筆記到現(xiàn)在超過(guò)250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲(chóng)、機(jī)器學(xué)習(xí)等方面,別再說(shuō)不知道該從哪開(kāi)始,實(shí)戰(zhàn)哪里找了
“點(diǎn)贊”傳統(tǒng)美德不能丟 
