最近不是在學習plotly嘛,為了方便理解,我們這裡取excel繪圖中常見的16種圖表為例,分兩期演示這些基礎圖表怎麼用plotly進行繪製!
第一部分:柱狀圖、條形圖、折線圖、面積圖、餅圖與圓環圖、散點圖、氣泡圖和極坐標(雷達圖)第二部分:樹狀圖、旭日圖、直方圖、箱線圖、瀑布圖、漏鬥圖、股價圖和地圖excel插入圖表今天,我們介紹第一部分8類圖表的繪製。
目錄:
0. 準備工作
1. 柱狀圖
2. 條形圖
3. 折線圖
4. 面積圖
5. 餅圖與圓環圖
6. 散點圖
7. 氣泡圖
8. 極坐標(雷達圖)
0. 準備工作我這邊是在jupyterlab中演示的plotly圖表,如果只安裝plotly是無法正常顯示圖表的(會顯示為空白),我們需要進行以下準備(以下命令均在cmd下操作即可):
# 安裝plotly庫及plotly-orca庫
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。我們這裡用到的是後者,至於其中的區別,大概就是後者是高級版本,封裝了很多後者的複雜操作,可以直接用pandas.Dataframe類型,是現在主推的。
1. 柱狀圖我們知道,在excel插入圖表的時候,柱狀圖一般可選堆疊柱狀圖和簇狀柱狀圖。
柱狀圖:
# 自帶數據集 gapminder
data = px.data.gapminder()
data.head()
gapminder# 柱狀圖
import plotly.express as px
data_canada = px.data.gapminder().query("country == 'Canada'")
fig = px.bar(
data_canada, # 數據集
x='year', # x軸
y='pop', # y軸
)
fig.show()
柱狀圖堆疊柱狀圖:
# 自帶數據集 medals_long(長表數據)
long_df = px.data.medals_long()
long_df.head()
medals_long# 堆疊柱狀圖 (使用長表數據,這種數據excel無法直接繪製堆疊圖)
import plotly.express as px
long_df = px.data.medals_long()
fig = px.bar(
long_df, # 數據集
x="nation", # x軸
y="count", # y軸
color="medal", # 圖例顏色(這種情況下需要設定該參數根據medal類型才區分,否則同色)
title="堆疊柱狀圖 Long-Form Input", # 圖表標題
)
fig.show()
堆疊柱狀圖-長表# 自帶數據集 medals_long(寬表數據)
wide_df = px.data.medals_wide()
wide_df.head()
寬表# 堆疊柱狀圖 (使用長表數據,這種數據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 設置為 group則為簇狀柱形圖,可選 stack(疊加)、group(並列)、overlay(覆蓋)、relative(相對)
)
fig.show()
簇狀柱狀圖類似於excel裡柱狀圖填充色中依據數據點著色:
# 類似於excel裡柱狀圖填充色中依據數據點著色
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', # 指定柱狀圖顏色根據 lifeExp欄位數值大小自動著色
labels={'pop':'population of Canada'},
height=400, # 圖表高度
)
fig.show()
數據點著色2. 條形圖條形圖其實就是柱狀圖轉個90度,橫著顯示唄。所以,本質上是一樣的,唯一的區別:在 Bar 函數中設置orientation='h',其餘參數與柱狀圖相同。
# 在plotly繪圖中,條形圖與柱狀圖唯一的區別:在 Bar 函數中設置orientation='h',其餘參數與柱狀圖相同
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', # 指定柱狀圖顏色根據 lifeExp欄位數值大小自動著色
labels={'pop':'population of Canada'},
height=600, # 圖表高度
width=800, # 圖表寬度
orientation='h' # 條形圖設置參數
)
fig.show()
條形圖3. 折線圖折線圖大致可以是畫一個折線圖或多條折線圖。
單個折線圖:
# 折線圖
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', # 數據點顯示值
line_shape='linear', # 共有6種插值方式:'linear'、'spline'、'hv'、'vh'、'hvh'和'vhv。
)
fig.update_traces(
texttemplate='%{text:.2f}', # 數據點顯示值的格式
textposition='top center', # 數據點顯示的位置:'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', # 按照國家區分
)
fig.show()
多折線圖分組多折線圖:
# 分組多折線圖
import plotly.express as px
# 繪製各大洲每個國家人均壽命隨著時間變化曲線
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', # 按照國家區分
)
fig.show()
面積圖5. 餅圖與圓環圖我們在用excel繪製餅圖的時候,可以選擇既定配色方案,還可以自定義每個色塊的顏色。用plotly繪製的時候,這些自定義操作也是支持的。
# 餅圖
import plotly.express as px
# 篩選2007年歐洲數據
df = px.data.gapminder().query("year == 2007").query("continent == 'Europe'")
# 將小於200萬的國家標記為其他
df.loc[df['pop'] < 2.e6, 'country'] = 'Other countries'
# 繪製餅圖
fig = px.pie(df, values='pop', names='country', title='Population of European continent')
fig.show()
餅圖欄位多條數據自動處理:
# 自帶數據集 tips,欄位day下是星期,存在多條
df = px.data.tips()
df.head()
tips數據預覽我們可以看到,在tips數據集中,day欄位是星期,包含很多同星期的數據。在進行餅圖繪製的時候,以day欄位做分類,可以自動實際聚合求和操作。
# 如果 分類 標籤下有很多數據,則會自動進行分組求和
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()
自動聚合做餅圖設置配色方案:
關於配色方案的更多選擇,大家可以參考《我又用Python爬取了4000+股票數據,並用plotly繪製了樹狀熱力圖(treemap)》裡介紹的內容。
# 設置配色方案
import plotly.express as px
df = px.data.tips()
fig = px.pie(df, values='tip', names='day',
color_discrete_sequence=px.colors.sequential.RdBu, # 設置配色方案
)
fig.show()
設置配色方案作圖我們也可以自定義每個色塊顏色:
# 自定義配色
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()
自定義每個色塊顏色在餅圖上顯示數據標籤:
# 在餅圖上顯示數據標籤
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' # 數據標籤顯示的內容
)
fig.show()
在餅圖上顯示數據標籤圓環圖:
圓環圖是指餅圖中間一定半徑的圓部分為空白,設置參數hole=int即可(0-1)。
# 圓環圖
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, # 設置空心半徑比例
)
fig.show()
圓環圖6. 散點圖散點圖是x和y均為數字列表情況下的坐標點圖。
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類型數據:
# 自帶數據集 iris
df = px.data.iris()
df.head()
iris數據集pd.Dataframe類型數據散點圖# 設置數據點顏色和大小
import plotly.express as px
df = px.data.iris()
fig = px.scatter(df, x="sepal_width", y="sepal_length",
color="species", # 根據species欄位區分顏色
size='petal_length', # 根據sepal_length設置大小
hover_data=['petal_width'],
)
fig.show()
設置數據點顏色額大小做個三角函數的圖:
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()
cos(t)7. 氣泡圖# 氣泡圖
import plotly.express as px
df = px.data.gapminder()
fig = px.scatter(df.query("year==2007"), x="gdpPercap", y="lifeExp",
size="pop", # 設置氣泡大小依據欄位pop
color="continent",
hover_name="country",
log_x=True,
size_max=60, #設置最大氣泡
)
fig.show()
氣泡圖8. 極坐標(雷達圖)極坐標下,可以用點或線進行構圖,繪製點則用px.scatter_polar,繪製線則用px.line_polar。
# 自帶數據集 wind
df = px.data.wind()
df.head()
windimport plotly.express as px
df = px.data.wind()
fig = px.scatter_polar(df,
r="frequency", # 半徑
theta="direction", # 類型
)
fig.show()
極坐標著色和分組標識:
import plotly.express as px
df = px.data.wind()
fig = px.scatter_polar(df, r="frequency", theta="direction",
color="strength", # 顏色根據strength著色
symbol="strength", # 符號根據strength區分
size="frequency", # 大小根據 frequency 區分
color_discrete_sequence=px.colors.sequential.Plasma_r, # 設置配色方案
)
fig.show()
著色和分組標識雷達圖:
# 雷達圖
import plotly.express as px
df = px.data.wind()
fig = px.line_polar(df, r="frequency",
theta="direction",
color="strength",
line_close=True, # 線條是否閉環
color_discrete_sequence=px.colors.sequential.Plasma_r,
template="plotly_dark", # 主題模板
)
fig.show()
雷達圖扇形區域圖:
# 扇形圖區域
import plotly.express as px
fig = px.scatter_polar(r=range(0,90,10), theta=range(0,90,10),
range_theta=[0,90], # 設定區域
start_angle=0,
direction="counterclockwise", # 方位:'counterclockwise' 逆時針 ,'clockwise'順時針
)
fig.show()
扇形區域圖對比Excel系列圖書累積銷量達15w冊,讓你輕鬆掌握數據分析技能,感興趣的同學可以直接在各大電商平臺搜索書名了解: