別在Python中用Matplotlib和Seaborn作圖了,親,試試這個

大數(shù)據(jù)文摘轉(zhuǎn)載數(shù)據(jù)派THU
作者:Anmol Anmol
翻譯:王闖(Chuck)
校對:趙茹萱
是時候升級你的可視化游戲了。
數(shù)據(jù)可視化是人腦有效理解各種信息的最舒適、最直觀的方式。對于需要處理數(shù)據(jù)的人來說,能夠創(chuàng)建漂亮、直觀的可視化繪圖是一項(xiàng)非常重要的技能,這能夠有效地傳達(dá)數(shù)據(jù)洞察并推動后續(xù)執(zhí)行。
R語言提供了一些很棒的數(shù)據(jù)可視化(ggplot2、leaflet)和儀表板(R Shiny)包,用這些可以創(chuàng)建漂亮的可視化繪圖。然而Python 在這方面顯得有點(diǎn)落后,因?yàn)?matplotlib 并不是一個很好的可視化包。
Seaborn 是在 python 中創(chuàng)建靜態(tài)繪圖的一個很好的選擇,但不具備交互能力。靜態(tài)繪圖的一些限制是,我們無法放大繪圖中有趣的部分,也無法將鼠標(biāo)懸停在繪圖上以查看特定信息。
于是,plotly包閃亮登場了!


圖片來源:plotly
Plotly 是一個 Python 庫,用于創(chuàng)建交互式、出版級別的可視化繪圖。Plotly不僅具有 matplotlib及seaborn 所缺少的交互功能,還提供了更多種類的圖表,例如:
統(tǒng)計類圖表,如樹狀圖、誤差帶、平行類別圖等。 科學(xué)類圖表,如等高線圖、對數(shù)圖等。 財務(wù)類圖表,如漏斗圖、燭臺圖等。 氣泡圖、密度圖等。 生物信息類等其它圖表。
以上解釋了為什么你應(yīng)該使用 plotly 而不是 matplotlib 或 seaborn 進(jìn)行繪圖。
接下來,讓我們來點(diǎn)實(shí)際的!
在下一節(jié)中,我們將使用gapminder數(shù)據(jù)來繪制印度和中國兩國的社會經(jīng)濟(jì)隨時間的發(fā)展情況。我們會在pandas dataframe上進(jìn)行數(shù)據(jù)選擇和操作,如果你還不熟悉 pandas,那么建議可以先學(xué)習(xí)“用python進(jìn)行數(shù)據(jù)分析”。
你可以打開jupyter notebook,直接復(fù)制如下代碼,無需作任何修改。讓我們從安裝并導(dǎo)入plotly包開始。
# install plotly
! pip install plotly
# import plotly packages
import plotly.graph_objects as go
import plotly.express as px我們可以用 graph_objects 模塊創(chuàng)建不同類型的繪圖,并用express模塊來讀取gapminder數(shù)據(jù)?,F(xiàn)在,讓我們用 plotly express 讀取 gapminder 數(shù)據(jù)并查看前 5 行。
## reading the data and looking at the 1st five rows using head()
df = px.data.gapminder()
df.head()
從上表可以看出,數(shù)據(jù)包含了不同國家不同年份的預(yù)期壽命、人口、人均GDP等信息。現(xiàn)在,我們將篩選出印度和中國的dataframe。
# reading the datasets for India and China
df_india = df[df['country'] == 'India']
df_china = df[df['country'] == 'China']
df_india下表是印度的數(shù)據(jù),時間跨度從 1952 年到 2007 年。

印度和中國的人口
現(xiàn)在,我們要創(chuàng)建一個條形圖,來展示印度和中國的人口隨時間的變化。使用 plotly graph 對象模塊創(chuàng)建繪圖,分成2個步驟:
1. 設(shè)置圖形函數(shù),我們將在其中設(shè)置數(shù)據(jù)參數(shù)。數(shù)據(jù)參數(shù)設(shè)置為一個列表,其中包含印度和中國的條形圖函數(shù) (go.Bar)。在 bar 函數(shù)中,我們將 x 軸設(shè)置為年份列,將 y 軸設(shè)置為人口列,將標(biāo)記國家-顏色設(shè)置為印度-紅色,中國-藍(lán)色。
2. 使用 update_layout 函數(shù)設(shè)置圖表的標(biāo)題、x 軸和 y 軸的文本。
## Using figure function to define the data argument and setting it to the bars for India and China
fig = go.Figure(data = [go.Bar(x = df_india['year'], y = df_india['pop'], marker_color = 'indianred',name = 'India'),
go.Bar(x = df_china['year'], y = df_china['pop'], marker_color = 'blue',name = 'China')
])
## Setting the titles, xaxis and yaxis
fig.update_layout(title='Population of India and China over the years',
xaxis_title='Years',
yaxis_title='Population',
)
fig
作者繪圖
從上面的圖表中,我們可以看到兩國的人口增長速度相似。
預(yù)期壽命隨時間的變化
每當(dāng)我們有時間序列數(shù)據(jù)(年/月/周等的量測值)時,折線圖是顯示趨勢的最佳選擇。利用以下代碼,我們展示了印度和中國多年來的預(yù)期壽命變化情況。
# step 1 : Setting the figure function
fig = go.Figure(data = [go.Scatter(x = df_india['year'], y = df_india['lifeExp'],\
line = dict(color = 'firebrick', width = 4),
text = df_india['country'], name = 'India'),
go.Scatter(x = df_china['year'], y = df_china['lifeExp'],\
line = dict(color = 'blue', width = 4), text = df_china['country'], name = 'China')])
# step 2 : Setting the update_layout function
fig.update_layout(title='Life Expectency over the years',
xaxis_title='Years',
yaxis_title='Life Expectancy (years)',
)
fig
作者繪圖
兩國的預(yù)期壽命之間一直存在差距,除了 1960 年前后,中國的預(yù)期壽命因“三年困難時期”而突然下降。
預(yù)期壽命與人均 GDP隨時間的變化
當(dāng)我們想要查看 2 個連續(xù)(數(shù)字)特征之間的相互作用時,首選散點(diǎn)圖。
在下面的代碼中,我們創(chuàng)建了這兩個國家的預(yù)期壽命和人均 GDP 之間的散點(diǎn)圖。
fig = go.Figure(data = [go.Scatter(y = df_india['lifeExp'], x = df_india['gdpPercap'],\
mode = 'markers', name = 'India')
,
go.Scatter(y = df_china['lifeExp'], x = df_china['gdpPercap'],\
mode = 'markers', name = 'China')
])
fig.update_layout(title='Life Expectency vs GDP per Capita',
yaxis_title='Life Expectancy (years)',
xaxis_title='gdpPercap',
)
fig
作者繪圖
對于這兩個國家來說,預(yù)期壽命都隨著人均 GDP 的增加而增加。與印度相比,中國人均GDP有了顯著提高。
世界發(fā)展隨時間的變化:動畫展示
利用氣泡圖,我們可以在 2D 圖上展示 3 個維度(x 軸、y 軸和氣泡大?。?。使用以下代碼,我們可以用 plotly express 模塊的散點(diǎn)函數(shù)創(chuàng)建氣泡圖。
df = px.data.gapminder()
fig = px.scatter(df, x = 'gdpPercap', y = 'lifeExp', size = 'pop',
color = 'continent', hover_name='country',
log_x= True, size_max=50, title = 'World Development in 2007',
animation_frame="year", animation_group="country", range_y = [25,90])
fig.update_layout(xaxis = dict(showgrid=False), yaxis = dict(showgrid=False))
fig讓我們學(xué)習(xí)一下函數(shù)的一些重要參數(shù):
size:一個數(shù)值類變量的列,它代表氣泡的大小。
color:一個分類變量的列,它代表氣泡的顏色。在我們的示例中,默認(rèn)為每個大陸分配一種顏色。
log_x :將 X 軸(人均 GDP)設(shè)置為對數(shù)刻度。
size_max:設(shè)置氣泡的最大尺寸。是尺寸標(biāo)準(zhǔn)化參數(shù)。
animation_frame:用于標(biāo)記動畫幀的dataframe列的值。在我們的示例中,參數(shù)設(shè)置為年份列。
animation_group:匹配“animation_group”的行將被作為在每一幀中描述相同的對象。我們想看看每個國家多年來的進(jìn)展情況,因此將其設(shè)置為國家列。

這些年來,世界各國都取得了很大的發(fā)展。我們可以看到所有國家的預(yù)期壽命與人均 GDP(均隨時間增加)之間存在直接相關(guān)性。從這張圖表中你還可以發(fā)現(xiàn)更多,請在評論中分享你的發(fā)現(xiàn)。
寫在最后!
你還可以使用 plotly 創(chuàng)建交互式儀表板。Dash 是無需學(xué)習(xí) HTML、CSS 和 Javascript 即可快速創(chuàng)建漂亮Python 儀表板的繪圖框架。了解關(guān)于Dash的更多信息,見:https://bit.ly/311k37f.

