--世界上隻有一種真正的英雄主義,就是看清生活的真相之後依然熱愛生活,學習編程成就更好的自己--
Python語言簡潔生動,特别适合文科生學習入門IT世界,用幾十行代碼就能夠做一個完整的爬蟲腳本,開發效率杠杠的!短時間内即可解決工作和學習中碰到的各種棘手問題。(本人外語專業畢業,機緣巧合愛上編程,自學道路曲曲折折,痛并快樂!)在這裡總結一下自學Python遇到的難點和重點,分享碼過的代碼和要點總結,希望能夠給初學者一點啟示和鼓勵,同時願意結交更多大神交流有助提升自己的水平。
今天分享如何使用Plotly繪制一個比較複雜的圖表--柱狀和折線雙坐标複合圖表,即是:柱狀圖和折線圖共同展示, 柱狀圖對應一個坐标軸,折線圖對應另一個坐标軸。另外,可把相關制圖過程做成一個自定義制圖函數,方便後續直接調用出圖,可以大大節省時間,提高工作效率。下面還以Plotly内置的世界人口數據集合為案例展開講解:
1.調包并抽取一個國家數據,方便後續制圖和演示:
首先拿德國數據為例,生成一個新的人口數量字段其單位為百萬,方便跟壽命數據共同生成柱狀圖,同時生成一個新的人均GDP字段其單位為千元後續生成折線圖。
2.編寫一個作圖自定義函數,有兩個參數,X參數為數據集合,Y參數為圖表名字:
作圖自定義函數編寫如下:
#['#0d0887', '#46039f', '#7201a8', '#9c179e', '#bd3786', '#d8576b', '#ed7953', '#fb9f3a', '#fdca26', '#f0f921']
def Get_Two_Bar_One_Line(X,Y):
fig = go.Figure()
# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])
# Add traces
fig_bar_one = go.Bar(name="人口數量", x=X["Year"], y=X["pop-Million"],marker_color='#44cef6')
fig_bar_two = go.Bar(name="平均壽命", x=X["Year"], y=X["life"], marker_color='#bcbd22')
fig_line_one = go.Scatter(name="人均GDP",x=X["Year"], y=X["gdpPercap-Thousand"],line=dict(color='red', width=3, dash='dash'))
#define the positions
fig.add_trace(fig_bar_one,secondary_y=False)
fig.add_trace(fig_bar_two,secondary_y=False)
fig.add_trace(fig_line_one,secondary_y=True)
# Add figure title
fig.update_layout(title_text=Y)
# Set x-axis title
fig.update_xaxes(title_text="1952年到2007年期間國家整體情況變化")
# Set y-axes titles
fig.update_yaxes(title_text="<b>primary</b>--人口數量百萬和平均壽命", secondary_y=False)
fig.update_yaxes(title_text="<b>secondary</b>--人均GDG水平--千元", secondary_y=True)
return fig.show()
該作圖函數可做調整,比如:圖形顔色,折線形式和标題内容等等,大家根據實際情況進行個性化處理。
3.利用該作圖函數生成相應圖表:
生成圖表左側Y軸刻度展示了人口壽命和數量,右側Y軸刻度展示了人均GDP水平情況,同時還可以進行數據交互,直觀和生動展示了相關情況。
4.調取南非國家數據集合來試試:
通過已有的制圖函數生成圖表如下:
5.調取泰國國家數據集合來試試:
對已有的制圖函數柱狀圖顔色參數(平均壽命)調整:
生成圖表如下:
6.調取日本國家數據集合來試試:
通過已有的制圖函數生成圖表如下:
7.最後調取越南國家數據集合來試試:
通過已有的制圖函數生成圖表如下:
代碼彙總如下:
#import plotly to get the datasets
from plotly.subplots import make_subplots
import plotly.graph_objs as go
import plotly.offline as py
import plotly_express as px
#Get a dataset of a dedicated country
df = px.data.gapminder().query("country == ['Germany']") #'Japan','Germany','Italy','Canada','Spain','Thailand','Argentina'
df["life"] = df["lifeExp"].astype(int)
df["pop-Million"] = (df["pop"]/1000000).astype(int) #Get pop 100W /人口數量以百萬單位來顯示
df["gdpPercap-Thousand"] = (df["gdpPercap"]/1000).astype(float) #Get gdpPercap as Tousand /人均GDP以千元單位顯示
df["Year"] = df["year"].astype(str) #Convert year as int into string
display(df)
display(df.dtypes)
#['#0d0887', '#46039f', '#7201a8', '#9c179e', '#bd3786', '#d8576b', '#ed7953', '#fb9f3a', '#fdca26', '#f0f921']
def Get_Two_Bar_One_Line(X,Y):
fig = go.Figure()
# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])
# Add traces
fig_bar_one = go.Bar(name="人口數量", x=X["Year"], y=X["pop-Million"],marker_color='#44cef6')
fig_bar_two = go.Bar(name="平均壽命", x=X["Year"], y=X["life"], marker_color='#bcbd22')
fig_line_one = go.Scatter(name="人均GDP",x=X["Year"], y=X["gdpPercap-Thousand"],line=dict(color='red', width=3, dash='dash'))
#define the positions
fig.add_trace(fig_bar_one,secondary_y=False)
fig.add_trace(fig_bar_two,secondary_y=False)
fig.add_trace(fig_line_one,secondary_y=True)
# Add figure title
fig.update_layout(title_text=Y)
# Set x-axis title
fig.update_xaxes(title_text="1952年到2007年期間國家整體情況變化")
# Set y-axes titles
fig.update_yaxes(title_text="<b>primary</b>--人口數量百萬和平均壽命", secondary_y=False)
fig.update_yaxes(title_text="<b>secondary</b>--人均GDG水平--千元", secondary_y=True)
return fig.show()
Get_Two_Bar_One_Line(df,"德國")
#Get a dataset of a dedicated country
df = px.data.gapminder().query("country == ['South Africa']") #'Japan','Germany','Italy','Canada','Spain','Thailand','Argentina'
df["life"] = df["lifeExp"].astype(int)
df["pop-Million"] = (df["pop"]/1000000).astype(int) #Get pop 100W /人口數量以百萬單位來顯示
df["gdpPercap-Thousand"] = (df["gdpPercap"]/1000).astype(float) #Get gdpPercap as Tousand /人均GDP以千元單位顯示
df["Year"] = df["year"].astype(str) #Convert year as int into string
display(df)
Get_Two_Bar_One_Line(df,"南非")
#Get a dataset of a dedicated country
df = px.data.gapminder().query("country == ['Thailand']") #'Japan','Germany','Italy','Canada','Spain','Thailand','Argentina'
df["life"] = df["lifeExp"].astype(int)
df["pop-Million"] = (df["pop"]/1000000).astype(int) #Get pop 100W /人口數量以百萬單位來顯示
df["gdpPercap-Thousand"] = (df["gdpPercap"]/1000).astype(float) #Get gdpPercap as Tousand /人均GDP以千元單位顯示
df["Year"] = df["year"].astype(str) #Convert year as int into string
display(df)
#['#0d0887','#46039f', '#7201a8', '#9c179e', '#bd3786', '#d8576b', '#ed7953', '#fb9f3a', '#fdca26', '#f0f921']
def Get_Two_Bar_One_Line(X,Y):
fig = go.Figure()
# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])
# Add traces
fig_bar_one = go.Bar(name="人口數量", x=X["Year"], y=X["pop-Million"],marker_color='#44cef6')
fig_bar_two = go.Bar(name="平均壽命", x=X["Year"], y=X["life"], marker_color='#9c179e')
fig_line_one = go.Scatter(name="人均GDP",x=X["Year"], y=X["gdpPercap-Thousand"],line=dict(color='red', width=3, dash='dash'))
#define the positions
fig.add_trace(fig_bar_one,secondary_y=False)
fig.add_trace(fig_bar_two,secondary_y=False)
fig.add_trace(fig_line_one,secondary_y=True)
# Add figure title
fig.update_layout(title_text=Y)
# Set x-axis title
fig.update_xaxes(title_text="1952年到2007年期間國家整體情況變化")
# Set y-axes titles
fig.update_yaxes(title_text="<b>primary</b>--人口數量百萬和平均壽命", secondary_y=False)
fig.update_yaxes(title_text="<b>secondary</b>--人均GDG水平--千元", secondary_y=True)
return fig.show()
Get_Two_Bar_One_Line(df,"泰國")
#Get a dataset of a dedicated country
df = px.data.gapminder().query("country == ['Japan']") #'Japan','Germany','Italy','Canada','Spain','Thailand','Argentina'
df["life"] = df["lifeExp"].astype(int)
df["pop-Million"] = (df["pop"]/1000000).astype(int) #Get pop 100W /人口數量以百萬單位來顯示
df["gdpPercap-Thousand"] = (df["gdpPercap"]/1000).astype(float) #Get gdpPercap as Tousand /人均GDP以千元單位顯示
df["Year"] = df["year"].astype(str) #Convert year as int into string
display(df)
Get_Two_Bar_One_Line(df,"日本")
#Get a dataset of a dedicated country
df = px.data.gapminder().query("country == ['Vietnam']") #'Japan','Germany','Italy','Canada','Spain','Thailand','Argentina'
df["life"] = df["lifeExp"].astype(int)
df["pop-Million"] = (df["pop"]/1000000).astype(int) #Get pop 100W /人口數量以百萬單位來顯示
df["gdpPercap-Thousand"] = (df["gdpPercap"]/1000).astype(float) #Get gdpPercap as Tousand /人均GDP以千元單位顯示
df["Year"] = df["year"].astype(str) #Convert year as int into string
display(df)
Get_Two_Bar_One_Line(df,"越南")
通過上面的内容看到,如何做好作圖自定義函數是關鍵!!!方便後續調用并直接生成相關複雜圖表,減少重複代碼出現,現實中事先固定好幾個模式的作圖自定義函數,然後利用處理好的數據集直接生成優雅和統一的可視化報告,效率真的哇塞啊!!!!
END
我為人人,人人為我!!歡迎大家關注,點贊和轉發!!!
~~人生不是賽場,夢想不容退場~~不斷努力學習蛻變出一個更好的自己,不斷分享學習路上的收獲和感悟幫助他人成就自己!!!
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!