使用Python繪制數(shù)據(jù),可以使用三種不同方式,它們分別是Pandas,Seaborn和Plotly。 我們將通過(guò)利用《 2019年世界幸福報(bào)告》中的數(shù)據(jù)來(lái)做到這一點(diǎn)。我用Gapminder和Wikipedia的信息豐富了《世界幸福報(bào)告》數(shù)據(jù),以便探索新的關(guān)系和可視化。在整篇文章中,我將使用Life Ladder作為目標(biāo)變量。
我使用Python繪圖的歷史
大約兩年前,我開始更認(rèn)真地學(xué)習(xí)Python。 從那以后,幾乎沒(méi)有一個(gè)星期不讓我驚嘆于Python本身,或生態(tài)系統(tǒng)中眾多令人驚嘆的開源庫(kù)的簡(jiǎn)單性和易用性。 我熟悉的命令,模式和概念越多,那么所有事情就越有意義。
Matplotlib
使用Python進(jìn)行繪圖的情況恰恰相反。 最初,我用Matplotlib創(chuàng)建的幾乎每個(gè)圖表都看起來(lái)像是八十年代逃脫的罪犯。 更糟糕的是,要?jiǎng)?chuàng)建這些可憎的東西,我通常不得不在Stackoverflow上花費(fèi)數(shù)小時(shí)。 例如,研究nitty-gritty命令以更改x-ticks的傾斜度或類似的愚蠢行為。 甚至沒(méi)有讓我開始使用多張圖表。 結(jié)果看起來(lái)令人印象深刻,并且以編程方式創(chuàng)建這些圖表是一種奇妙的感覺(jué)。 例如,一次生成50個(gè)針對(duì)不同變量的圖表。 但是,這只是很多工作,需要您記住很多其他本來(lái)沒(méi)用的命令。
Seaborn
了解Seaborn是一種解脫。 Seaborn提取了許多微調(diào)。 毫無(wú)疑問(wèn),最終圖表的美學(xué)意義是一個(gè)巨大的飛躍。 但是,它也是基于Matplotlib構(gòu)建的。 通常,對(duì)于非標(biāo)準(zhǔn)調(diào)整,仍然有必要深入了解機(jī)器級(jí)的matplotlib代碼。
Bokeh
簡(jiǎn)要了解一下
Bokeh,我以為Bokeh將成為我的首選解決方案。 當(dāng)我從事地理空間可視化工作時(shí)遇到了Bokeh。 但是,我很快意識(shí)到,雖然Bokeh與眾不同,但它與matplotlib一樣復(fù)雜。
Plotly
我確實(shí)在一段時(shí)間前嘗試了plot.ly(從現(xiàn)在開始被稱為plotly)。 再一次,致力于地理空間數(shù)據(jù)的可視化。 那時(shí),它似乎比前面提到的庫(kù)還要不靠譜。需要一個(gè)帳戶,必須通過(guò)筆記本電腦登錄,然后才能使所有內(nèi)容在線呈現(xiàn)。 然后,還需要下載結(jié)果圖表。 我迅速放棄了。 但是,最近,我看了一個(gè)有關(guān)YouTube的視頻,該視頻關(guān)于plotly express和plotly 4.0,最重要的是,他們擺脫了所有這些在線限制。 我玩了一下,這篇文章就是它的結(jié)果。 我想遲到總比沒(méi)有好。
Kepler.gl(地理空間數(shù)據(jù)榮譽(yù)獎(jiǎng))
Kepler.gl雖然絕對(duì)不是Python庫(kù),但它是一種用于地理空間數(shù)據(jù)的基于Web的強(qiáng)大可視化工具。 您只需要CSV文件,即可使用Python輕松創(chuàng)建。 試試看!
我目前的工作流程
最終,我決定使用Pandas原始繪圖進(jìn)行快速檢查,并使用Seaborn生成要在報(bào)告和演示文稿中使用的圖表(視覺(jué)效果很重要)。
分布的重要性在圣地亞哥學(xué)習(xí)期間,我教過(guò)統(tǒng)計(jì)學(xué)(Stats 119)。 統(tǒng)計(jì)119是統(tǒng)計(jì)的入門課程。 該課程包括統(tǒng)計(jì)基礎(chǔ),例如數(shù)據(jù)匯總(可視和定量),幾率和概率的概念,回歸,抽樣以及最重要的分布。 這次是我對(duì)數(shù)量和現(xiàn)象的理解幾乎全部轉(zhuǎn)變?yōu)榛诜植急硎荆ù蟛糠謺r(shí)間是高斯)。
時(shí)至今日,我發(fā)現(xiàn)這兩個(gè)數(shù)量的平均含義令人吃驚,而標(biāo)準(zhǔn)偏差可以幫助您把握現(xiàn)象。 僅通過(guò)了解這兩個(gè)數(shù)字,就可以輕松得出特定結(jié)果的可能性。 人們立即知道大部分結(jié)果將在哪里。 它為您提供了一個(gè)參考框架,可以快速將軼事與有統(tǒng)計(jì)意義的事件區(qū)分開來(lái),而無(wú)需進(jìn)行過(guò)于復(fù)雜的計(jì)算。
一般而言,面對(duì)新數(shù)據(jù)時(shí),我的第一步是嘗試可視化其分布,以更好地理解數(shù)據(jù)。
加載數(shù)據(jù)和導(dǎo)入庫(kù)讓我們加載本文中將要使用的數(shù)據(jù)。 我確實(shí)對(duì)數(shù)據(jù)進(jìn)行了一些預(yù)處理。 我在有意義的地方進(jìn)行數(shù)據(jù)填充處理。
# Load the data data = pd.read_csv('https://raw.githubusercontent.com/FBosler/AdvancedPlotting/master/combined_set.csv') # this assigns labels per year data['Mean Log GDP per capita'] = data.groupby('Year')['Log GDP per capita'].transform( pd.qcut, q=5, labels=(['Lowest','Low','Medium','High','Highest']) )數(shù)據(jù)集包含以下各列的值:
·
Year 年:計(jì)量年(從2007年到2018年)
·
Life Ladder 人生階梯:受訪者根據(jù)Cantril階梯,以0到10的等級(jí)(10最佳)衡量他們今天的生活價(jià)值
·
Log GDP per capita 對(duì)數(shù)人均GDP:根據(jù)購(gòu)買力平價(jià)(PPP)調(diào)整的人均GDP,根據(jù)世界銀行于2018年11月14日發(fā)布的世界發(fā)展指標(biāo)(WDI)得出
·
Social support 社會(huì)支持:對(duì)問(wèn)題的回答:“如果遇到麻煩,您是否有親戚或朋友可以在需要時(shí)幫助您?”
·
Healthy life expectancy at birth 出生時(shí)的健康預(yù)期壽命:出生時(shí)的預(yù)期壽命是根據(jù)世界衛(wèi)生組織(WHO)全球衛(wèi)生觀察站數(shù)據(jù)存儲(chǔ)庫(kù)中的數(shù)據(jù)構(gòu)建的,其中提供了2005、2010、2015和2016年的數(shù)據(jù)。
·
Freedom to make life choices 選擇生活的自由度:對(duì)問(wèn)題的回答:“您對(duì)選擇自己的生活的自由感到滿意還是不滿意?”
·
Generosity 慷慨度:與"人均GDP"相比,對(duì)"您在過(guò)去一個(gè)月向慈善機(jī)構(gòu)捐款了嗎?"的回應(yīng)
·
Perceptions of corruption 對(duì)腐敗的看法:回答"腐敗是否在整個(gè)政府范圍內(nèi)廣泛存在?“和"腐敗是否在企業(yè)內(nèi)部廣泛分布?”
·
Positive affect 積極影響:包括前一天的幸福,笑聲和享受的平均頻率。
·
Negative affect 負(fù)面影響:包括前一天擔(dān)憂,悲傷和憤怒的平均頻率。
·
Confidence in national government 對(duì)國(guó)家政府的信心:不言自明
·
Democratic Quality 民主素質(zhì):一個(gè)國(guó)家的民主程度
·
Delivery Quality 交付質(zhì)量:一個(gè)國(guó)家兌現(xiàn)其政策的效果如何
·
Gapminder Life Expectancy Gapminder預(yù)期壽命:Gapminder的預(yù)期壽命
·
Gapminder Population Gapminder人口:一個(gè)國(guó)家的人口
快速:使用Pandas進(jìn)行基本繪圖
Pandas具有內(nèi)置的繪圖功能,可以在Series或DataFrame上調(diào)用它。 我喜歡這些繪圖功能,因?yàn)樗鼈兒?jiǎn)潔,使用合理的默認(rèn)值,并且可以快速了解發(fā)生的情況。
要?jiǎng)?chuàng)建繪圖,請(qǐng)對(duì)數(shù)據(jù)調(diào)用.plot(kind = ),如下所示:
np.exp(data[data['Year']==2018]['Log GDP per capita']).plot( kind='hist' )運(yùn)行上面的命令將產(chǎn)生以下圖表。
2018: Histogram of the number of countries per GDP per Capita bucket. Not surprisingly, most countri
使用Pandas進(jìn)行繪圖時(shí),有五個(gè)主要參數(shù):
· kind:Pandas必須知道您要?jiǎng)?chuàng)建哪種圖,以下選項(xiàng)可用hist,bar,barh,scatter,area,kde,line,box,hexbin,餅圖。
· figsize:允許覆蓋6英寸寬和4英寸高的默認(rèn)輸出大小。 figsize需要一個(gè)元組(例如,我經(jīng)常使用的figsize =(12,8))
· title:向圖表添加標(biāo)題。 在大多數(shù)情況下,我用它來(lái)澄清圖表中顯示的內(nèi)容,以便當(dāng)我回到圖表上時(shí),可以快速確定發(fā)生了什么。 title需要一個(gè)字符串。
· bins:允許覆蓋直方圖的bin寬度。 bins需要一個(gè)列表或類似列表的值序列(例如bins = np.arange(2,8,0.25))
· xlim / ylim:允許覆蓋軸的最大值和最小值的默認(rèn)值。 xlim和ylim都期望有一個(gè)元組(例如xlim =(0,5))
讓我們快速瀏覽各種可用的plots類型。
垂直條形圖data[ data['Year'] == 2018 ].set_index('Country name')['Life Ladder'].nlargest(15).plot( kind='bar', figsize=(12,8) )
2018: List of 15 happiest countries is led by Finnland
水平條形圖np.exp(data[ data['Year'] == 2018 ].groupby('Continent')['Log GDP per capita'].mean()).sort_values().plot( kind='barh', figsize=(12,8) )!
Average GDP per capita by continent in 2011 USD Dollars clearly led by Australia and New Zealand
箱形圖data['Life Ladder'].plot( kind='box', figsize=(12,8) )
Box plot of the distribution of Life Ladder shows that the median is somewhere around 5.5 ranging fr
散點(diǎn)圖data[['Healthy life expectancy at birth','Gapminder Life Expectancy']].plot( kind='scatter', x='Healthy life expectancy at birth', y='Gapminder Life Expectancy', figsize=(12,8) )
Scatter plot of the World Happiness Report life expectation against the Gapminder life expectation s
六邊形圖data[data['Year'] == 2018].plot( kind='hexbin', x='Healthy life expectancy at birth', y='Generosity', C='Life Ladder', gridsize=20, figsize=(12,8), cmap="Blues", # defaults to greenish sharex=False # required to get rid of a bug )
2018: Hexbin plot, plotting life expectancy against generosity. The color of bins indicates the aver
餅圖data[data['Year'] == 2018] .groupby( ['Continent'])['Gapminder Population'] .sum() .plot( kind='pie', figsize=(12,8), cmap="Blues_r", # defaults to orangish )
2018: Pie chart showing the total population by continent
堆積面積圖data.groupby( ['Year','Continent'])['Gapminder Population'] .sum() .unstack() .plot( kind='area', figsize=(12,8), cmap="Blues", # defaults to orangish )
Population numbers accross the globe are on the rise.
折線圖data[ data['Country name'] == 'Germany'] .set_index('Year')['Life Ladder'] .plot( kind='line', figsize=(12,8) )
Line chart depicting the development of happiness in Germany.
關(guān)于Pandas繪圖的結(jié)論用Pandas繪圖很方便。 它易于訪問(wèn),而且速度很快。 Plot很難看。 偏離默認(rèn)值是不可能的,這是可以的,因?yàn)槲覀冞有其他工具可以使圖表更具美學(xué)吸引力。 去看看seaborn吧。
本文翻譯自Fabian Bosler的文章《Learn how to create beautiful and insightful charts with Python — the Quick, the Pretty, and the Awesome》 參考
https://towardsdatascience.com/plotting-with-python-c2561b8c0f1f)