大數(shù)據(jù)分析如何在Python中生成FiveThirtyEight圖?如果你閱讀大數(shù)據(jù)分析文章,則可能已經(jīng)迷失了FiveThirtyEight的內(nèi)容。自然,他們的出色可視化使你印象深刻。你想制作自己的出色可視化文件,所以問(wèn)百度一下如何做到這一點(diǎn)。你收到了一些答案,但它們相當(dāng)模糊。你仍然無(wú)法自己完成圖表。在大數(shù)據(jù)分析如何在Python中生成FiveThirtyEight圖中,我們將為你提供幫助。使用Python的matplotlib和pandas,我們將看到復(fù)制任何FiveThirtyEight(FTE)可視化的核心部分都相當(dāng)容易。我們將從這里開(kāi)始:
并且,在大數(shù)據(jù)分析如何在Python中生成FiveThirtyEight圖的結(jié)尾,到達(dá)此處:
要繼續(xù)學(xué)習(xí),你至少需要一些Python的基礎(chǔ)知識(shí)。如果你知道方法和屬性之間有什么區(qū)別,那么你就很好了。
引入數(shù)據(jù)集
我們將使用描述1970年至2011年美國(guó)授予女性的單身漢百分比的數(shù)據(jù)進(jìn)行處理。我們將使用由大數(shù)據(jù)分析家匯編的數(shù)據(jù)集
如果你想自己編寫(xiě)代碼,請(qǐng)從Randal的博客中下載數(shù)據(jù)。為了節(jié)省時(shí)間,你可以跳過(guò)下載文件,而只需將直接鏈接傳遞給pandasread_csv() 函數(shù)。在以下代碼單元中,我們:
1)導(dǎo)入pandas模塊。
2)將指向數(shù)據(jù)集的直接鏈接作為分配string給名為的變量direct_link。
3)使用讀取數(shù)據(jù)read_csv(),并將內(nèi)容分配給women_majors。
4)使用info() 方法打印有關(guān)數(shù)據(jù)集的信息。我們正在尋找行和列的數(shù)量,并同時(shí)檢查null值。
5)使用該head() 方法顯示前五行,以更好地理解數(shù)據(jù)集的結(jié)構(gòu)。
除了
Year列,每隔一列的名稱(chēng)表示學(xué)士學(xué)位的主題。“學(xué)士學(xué)位”列中的每個(gè)數(shù)據(jù)點(diǎn)都代表授予女性學(xué)士學(xué)位的百分比。因此,每一行都描述了給定年份中授予女性的各種學(xué)士學(xué)位的百分比。如前所述,我們擁有1970年至2011年的數(shù)據(jù)。為確認(rèn)后一個(gè)限制,我們使用tail() 方法打印數(shù)據(jù)集的最后五行:
我們的FiveThirtyEight圖的上下文
幾乎每個(gè)FTE圖都是文章的一部分。圖形通過(guò)說(shuō)明一個(gè)小故事或一個(gè)有趣的想法來(lái)補(bǔ)充文本。在復(fù)制FTE圖時(shí),我們需要注意這一點(diǎn)。為了避免偏離大數(shù)據(jù)分析如何在Python中生成FiveThirtyEight圖的主要任務(wù),我們僅假裝我們已經(jīng)撰寫(xiě)了一篇有關(guān)中國(guó)教育中性別差距的演變的文章?,F(xiàn)在,我們需要?jiǎng)?chuàng)建一個(gè)圖表,以幫助讀者直觀地了解1970年情況對(duì)女性而言真的很差的單身漢的性別差異的演變。我們已經(jīng)設(shè)定了20%的閾值,現(xiàn)在我們想要繪制每位女性的變化趨勢(shì)圖1970年,女性畢業(yè)生的學(xué)士學(xué)位比例不到20%。讓我們首先確定那些特定的學(xué)士學(xué)位。在以下代碼單元中,我們將:
1)用途.loc,一個(gè)基于標(biāo)簽的索引,來(lái):
a)選擇第一行(對(duì)應(yīng)于1970年);
b)僅在值小于20的情況下選擇第一行中的項(xiàng)目;該Year字段也會(huì)被檢查,但顯然不會(huì)包括在內(nèi),因?yàn)?970年大于20。
2)將結(jié)果內(nèi)容分配給under_20。
使用matplotlib的默認(rèn)樣式
讓我們開(kāi)始研究圖表。我們首先來(lái)看看默認(rèn)情況下可以構(gòu)建的內(nèi)容。在下面的代碼塊中,我們將:
1)運(yùn)行Jupyter魔術(shù)%matplotlib以使Jupyter和matplotlib有效地協(xié)同工作,并添加inline使我們的圖形顯示在筆記本中。
2)通過(guò)使用繪制圖形plot() 的方法上women_majors。我們傳入plot()以下參數(shù):
a)x–指定women_majors用于x軸的列;
b)y–指定women_majors要用于y軸的列;我們將使用under_20存儲(chǔ)在.index該對(duì)象屬性中的索引標(biāo)簽;
c)figsize–將圖形的大小設(shè)置為tuple,(width, height)以英寸為單位。
3)將繪圖對(duì)象分配給一個(gè)名為的變量under_20_graph,并打印其類(lèi)型以表明熊貓使用matplotlib引擎蓋下的對(duì)象。
使用matplotlib的第五十八樣式
上面的圖形具有某些特征,例如,棘的寬度和顏色,y軸標(biāo)簽的字體大小,不存在網(wǎng)格等。所有這些特征構(gòu)成了matplotlib的默認(rèn)樣式。作為簡(jiǎn)短的括號(hào),值得一提的是,在大數(shù)據(jù)分析如何在Python中生成FiveThirtyEight圖中,我們將使用一些技術(shù)術(shù)語(yǔ)來(lái)表示圖形的各個(gè)部分。如果你感到迷茫,可以參考以下圖例。
除了默認(rèn)樣式外,matplotlib還帶有一些內(nèi)置樣式,我們可以隨時(shí)使用它們。要查看可用樣式的列表,我們將:
1)以名稱(chēng) 導(dǎo)入matplotlib.style 模塊style。
2)探索matplotlib.style.available(此模塊的預(yù)定義變量)的內(nèi)容,其中包含所有可用的內(nèi)置樣式的列表。
你可能已經(jīng)觀察到有一種內(nèi)置樣式稱(chēng)為
fivethirtyeight。讓我們使用這種樣式,看看結(jié)果如何。為此,我們將使用同一模塊(我們以名稱(chēng)導(dǎo)入)中恰當(dāng)命名的use() 函數(shù)。然后,我們將使用與之前相同的代碼來(lái)生成圖形。matplotlib.stylestyle
哇,那是一個(gè)重大變化!關(guān)于我們的第一個(gè)圖,我們可以看到該圖具有不同的背景色,帶有網(wǎng)格線,沒(méi)有任何刺,主要刻度標(biāo)簽的粗細(xì)和字體大小均不同,等等。你可以閱讀這里的fivethirtyeight樣式的技術(shù)說(shuō)明–它還應(yīng)該使你對(duì)使用該樣式時(shí)后臺(tái)運(yùn)行的代碼有一個(gè)很好的了解。樣式表的作者Cameron David-Pilon在這里討論了一些特征。
matplotlib第五十八樣式的局限性
總而言之,使用
fivethirtyeight風(fēng)格顯然使我們更接近我們的目標(biāo)。盡管如此,仍有許多工作要做。讓我們檢查一個(gè)簡(jiǎn)單的FTE圖,并查看我們還需要添加到圖中的內(nèi)容。
通過(guò)將上面的圖表與到目前為止所做的比較,我們可以看到我們?nèi)匀恍枰?br />
1)添加標(biāo)題和副標(biāo)題。
2)刪除塊樣式圖例,并在相關(guān)繪圖線附近添加標(biāo)簽。我們還必須使這些標(biāo)簽周?chē)木W(wǎng)格線透明。
3)添加一個(gè)簽名底部欄,其中提到圖形的作者和數(shù)據(jù)源。
4)添加一些其他小的調(diào)整:
a)增加刻度線標(biāo)簽的字體大小;
b)在y軸的主要刻度標(biāo)簽之一上添加“%”符號(hào);
c)移除x軸標(biāo)簽;
d)在y = 0處加粗水平網(wǎng)格線;
e)在y軸的刻度標(biāo)簽旁邊添加一條額外的網(wǎng)格線;
f)增加圖形的側(cè)邊距。
為了最大程度地減少生成圖形所花費(fèi)的時(shí)間,請(qǐng)務(wù)必避免開(kāi)始添加標(biāo)題,副標(biāo)題或任何其他文本片段,這一點(diǎn)很重要。在matplotlib中,通過(guò)指定x和y坐標(biāo)來(lái)定位文本片段,如我們?cè)谝韵履承┎糠种兴?jiàn)。要詳細(xì)復(fù)制上面的FTE圖,請(qǐng)注意,我們必須將y軸的刻度標(biāo)簽與標(biāo)題和副標(biāo)題垂直對(duì)齊。我們希望避免出現(xiàn)我們想要的垂直對(duì)齊方式,通過(guò)增加刻度線標(biāo)簽的字體大小而丟失它的情況,然后必須再次更改標(biāo)題和副標(biāo)題的位置。
出于教學(xué)目的,我們現(xiàn)在將逐步調(diào)整FTE圖。因此,我們的代碼將跨越多個(gè)代碼單元。但是,實(shí)際上,只需要一個(gè)以上的代碼單元。
自定義刻度標(biāo)簽
我們將從增加刻度標(biāo)簽的字體大小開(kāi)始。在以下代碼單元中,我們:
1)使用與之前相同的代碼繪制圖形,然后將結(jié)果對(duì)象分配給fte_graph。分配變量使我們能夠重復(fù)輕松地在對(duì)象上應(yīng)用方法或訪問(wèn)其屬性。
2)使用具有以下參數(shù)的tick_params() 方法來(lái)增加所有主要刻度標(biāo)簽的字體大小:
a)axis–指定我們要修改的刻度標(biāo)簽所屬的軸;這里我們要修改兩個(gè)軸的刻度標(biāo)簽;
b)which –指示要影響的刻度標(biāo)簽(主要或次要標(biāo)簽;如果不知道區(qū)別,請(qǐng)參見(jiàn)前面顯示的圖例);
c)labelsize –設(shè)置刻度標(biāo)簽的字體大小。
你可能已經(jīng)注意到我們style.use('fivethirtyeight')這次沒(méi)有使用。這是因?yàn)橐坏┰谖覀兊拇a中首次聲明,任何matplotlib樣式的首選項(xiàng)都會(huì)變?yōu)槿质走x項(xiàng)。我們之前將樣式設(shè)置為fivethirtyeight,從那里所有后續(xù)圖形都繼承了該樣式。如果出于某種原因要返回默認(rèn)狀態(tài),請(qǐng)運(yùn)行style.use('default')?,F(xiàn)在,我們將通過(guò)對(duì)y軸的刻度標(biāo)簽進(jìn)行一些調(diào)整來(lái)建立以前的更改:
1)我們將50%(y軸的最高可見(jiàn)刻度)添加一個(gè)“%”符號(hào)。
2)我們還在其他可見(jiàn)標(biāo)簽之后添加了一些空白字符,以使它們與新的“ 50%”標(biāo)簽優(yōu)雅地對(duì)齊。
要對(duì)y軸的刻度標(biāo)簽進(jìn)行這些更改,我們將使用
set_yticklabels() 方法以及l(fā)abel參數(shù)。從下面的代碼可以推斷出,此參數(shù)可以采用混合數(shù)據(jù)類(lèi)型的列表,并且不需要傳入任何固定數(shù)量的標(biāo)簽。
在y = 0處加粗水平線
現(xiàn)在,我們將在y坐標(biāo)為0的水平線上加粗。為此,我們將使用
axhline() 方法來(lái)添加新的水平網(wǎng)格線,并覆蓋現(xiàn)有的水平網(wǎng)格線。我們使用的參數(shù)axhline()是:
1)y –指定水平線的y坐標(biāo);
2)color –指示線條的顏色;
3)linewidth –設(shè)置線寬;
4)alpha–調(diào)節(jié)線條的透明度,但是我們?cè)谶@里使用它來(lái)調(diào)節(jié)黑色的強(qiáng)度;值alpha范圍從0(完全透明)到1(完全不透明)。
添加額外的垂直線
如前所述,我們必須在y軸刻度標(biāo)簽的緊鄰處添加另一條垂直網(wǎng)格線。為此,我們只需調(diào)整x軸值的范圍即可。增大范圍的左限將導(dǎo)致我們需要額外的垂直網(wǎng)格線。在下面,我們使用
set_xlim() 方法與不言自明的參數(shù)left和right。
生成簽名欄
上面顯示的示例FTE圖的簽名欄具有一些明顯的特征:
1)它位于圖的底部。
2)作者的姓名位于簽名欄的左側(cè)。
3)數(shù)據(jù)源在簽名欄的右側(cè)提到。
4)文本具有淺灰色(與圖形的背景顏色相同)和深灰色背景。
5)作者姓名和來(lái)源姓名之間的區(qū)域也具有深灰色背景。
添加這樣的簽名欄似乎很困難,但是通過(guò)一點(diǎn)點(diǎn)巧思,我們可以很容易地完成它。我們將添加一個(gè)文本片段,為其提供淺灰色,并為深灰色的背景色。我們將作者的姓名和來(lái)源都寫(xiě)在一個(gè)文本片段中,但是我們將這兩個(gè)空格隔開(kāi),使得它們的結(jié)尾在最左邊,另一個(gè)在最右邊。令人高興的是,空白字符也將獲得深灰色背景,這將產(chǎn)生簽名欄的效果。我們還將使用一些空格字符來(lái)對(duì)齊作者的姓名和源名稱(chēng),正如你將在下一個(gè)代碼塊中看到的那樣。這也是移除x軸標(biāo)簽的好時(shí)機(jī)。這樣,我們可以更好地看到簽名欄如何適合圖形的整體方案。
1)通過(guò)將False值傳遞給set_visible()我們應(yīng)用于對(duì)象的方法來(lái)刪除x軸的標(biāo)簽fte_graph.xaxis.label。這樣想:我們?cè)L問(wèn)的xaxis屬性fte_graph,然后訪問(wèn)的label屬性fte_graph.xaxis。然后我們終于申請(qǐng)set_visible()了fte_graph.xaxis.label。
2)以上述方式在圖形上添加一小段文本。我們將使用具有以下參數(shù)的text() 方法:
a)x –指定文本的x坐標(biāo);
b)y –指定文本的y坐標(biāo);
c)s –指示要添加的文本;
d)fontsize –設(shè)置文本的大小;
e)color–指定文字的顏色;我們?cè)谙旅媸褂玫闹档母袷綖槭M(jìn)制;我們使用這種格式來(lái)完全匹配整個(gè)圖形的背景顏色(如樣式代碼中fivethirtyeight所指定);
f)backgroundcolor –設(shè)置文本片段的背景色。
通過(guò)反復(fù)試驗(yàn)找到添加的文本片段的x和y坐標(biāo)。你可以通過(guò)floats向x和y參數(shù),這樣你就可以控制文本的位置高的精度水平。還值得一提的是,我們通過(guò)以下方式調(diào)整了簽名欄的位置,即添加了一些視覺(jué)上令人耳目一新的橫向邊距(我們之前討論了此調(diào)整)。為了增加左邊距,我們只是降低了x坐標(biāo)的值。為了增加右邊的字符,我們?cè)谧髡叩拿趾驮吹拿种g添加了更多的空格字符–這將源的名字推到右邊,從而增加了所需的邊距。
另一種簽名欄
你還將遇到一種稍微不同的簽名欄:
FiveThirtyEight這種簽名欄也可以很容易地復(fù)制。我們將只添加一些灰色文本,并在其上方添加一行。我們將通過(guò)添加多個(gè)下劃線字符(“ _”)的文本片段來(lái)創(chuàng)建線條的視覺(jué)效果。你可能想知道為什么我們不習(xí)慣axhline()在所需的y坐標(biāo)上簡(jiǎn)單地畫(huà)一條水平線。我們不這樣做,因?yàn)樾滦袑⑾蛳峦蟿?dòng)圖形的整個(gè)網(wǎng)格,并且不會(huì)產(chǎn)生所需的效果。我們還可以嘗試添加箭頭,然后刪除指針,以便最終得到一條線。但是,“下劃線”解決方案要簡(jiǎn)單得多。在下一個(gè)代碼塊中,我們將實(shí)現(xiàn)剛剛討論的內(nèi)容。在前面的部分中,我們應(yīng)該已經(jīng)熟悉我們?cè)谶@里使用的方法和參數(shù)。
添加標(biāo)題和字幕
如果你檢查
幾個(gè)FTE圖,你可能會(huì)注意到標(biāo)題和副標(biāo)題的這些模式:
1)標(biāo)題幾乎總是帶有副標(biāo)題。
2)標(biāo)題提供了從特定圖形看的上下文角度。標(biāo)題幾乎從來(lái)都不是技術(shù)性的,它通常只表示一個(gè)簡(jiǎn)單的想法。它也幾乎從來(lái)沒(méi)有情緒中立。在上方的Fandango圖表中,我們可以看到一個(gè)簡(jiǎn)單的“具有情感動(dòng)感”的標(biāo)題(“ Fandango LOVES電影”),而沒(méi)有一個(gè)平淡的“各種電影分級(jí)類(lèi)型的分布”。
3)字幕提供了有關(guān)圖形的技術(shù)信息。該信息經(jīng)常使軸標(biāo)簽變得多余。由于我們已經(jīng)刪除了x軸標(biāo)簽,因此應(yīng)謹(jǐn)慎定制相應(yīng)的字幕。
4)在視覺(jué)上,標(biāo)題和副標(biāo)題具有不同的字體粗細(xì),并且它們是左對(duì)齊的(與大多數(shù)居中的標(biāo)題不同)。而且,如我們先前所示,它們與y軸的主要刻度標(biāo)簽垂直對(duì)齊。
現(xiàn)在,請(qǐng)注意上面的觀察,在圖中添加標(biāo)題和副標(biāo)題。在下面的代碼塊中,我們將基于到目前為止已編碼的內(nèi)容,我們將:
5)通過(guò)使用與text()在簽名欄中添加文本相同的方法來(lái)添加標(biāo)題和副標(biāo)題。如果你已經(jīng)對(duì)matplotlib有一定的經(jīng)驗(yàn),你可能想知道為什么我們不使用title()andsuptitle()方法。這是因?yàn)檫@兩種方法在精確移動(dòng)文本方面都具有可怕的功能。的唯一新參數(shù)text()是weight。我們用它來(lái)加粗標(biāo)題。
如果你想知道,原始FTE圖形中使用的字體是Decima Mono(付費(fèi)墻字體)。因此,我們將堅(jiān)持使用Matplotlib的默認(rèn)字體,無(wú)論如何看起來(lái)都非常相似。
添加色盲友好的顏色
現(xiàn)在,我們有了笨拙的矩形圖例。我們將擺脫它,并在每條繪圖線附近添加彩色標(biāo)簽。每行將具有特定的顏色,并且相同顏色的單詞將命名該行所對(duì)應(yīng)的學(xué)士學(xué)位。但是,首先,我們將修改繪圖線的默認(rèn)顏色,并添加
色盲友Bang Wong設(shè)計(jì)的色盲我們將使用上圖中的值,為可色盲的顏色編譯RGB參數(shù)列表。附帶說(shuō)明一下,我們避免使用黃色,因?yàn)閹в性擃伾奈谋酒卧趫D形的深灰色背景顏色上不易閱讀。編譯完此RGB參數(shù)列表后,我們將其傳遞給我們先前代碼中使用color的plot()方法的參數(shù)。請(qǐng)注意,matplotlib將要求RGB參數(shù)在0-1范圍內(nèi),因此我們將每個(gè)值除以255(最大RGB值)。我們不會(huì)費(fèi)心將零除,因?yàn)?/255 = 0。
好的顏色:
通過(guò)添加彩色標(biāo)簽來(lái)更改圖例樣式
最后,我們通過(guò)使用
text()以前使用的方法。唯一的新參數(shù)是rotation,我們使用它旋轉(zhuǎn)每個(gè)標(biāo)簽,以使其優(yōu)雅地適合圖形。我們還將在此處做一些技巧,通過(guò)簡(jiǎn)單地修改標(biāo)簽的背景顏色以使其與圖形的顏色相匹配,使標(biāo)簽周?chē)木W(wǎng)格線透明。在之前的代碼中,我們僅plot()通過(guò)將legend參數(shù)設(shè)置為來(lái)修改方法False。這將使我們擺脫默認(rèn)的圖例。由于colors列表已經(jīng)存儲(chǔ)在上一個(gè)單元格的內(nèi)存中,因此我們也跳過(guò)了重新聲明列表的操作。
下一步
就是這樣,我們的圖形現(xiàn)在可以發(fā)布了!為了簡(jiǎn)短地回顧一下,我們從生成具有matplotlib默認(rèn)樣式的圖形開(kāi)始。然后,我們通過(guò)一系列步驟將該圖帶入“ FTE級(jí)”:
1)我們使用了matplotlib的內(nèi)置fivethirtyeight樣式。
2)我們添加了標(biāo)題和副標(biāo)題,并分別對(duì)其進(jìn)行了自定義。
3)我們添加了簽名欄。
4)我們刪除了默認(rèn)圖例,并添加了彩色標(biāo)簽。
5)我們還進(jìn)行了一系列其他小的調(diào)整:自定義刻度線標(biāo)簽,在y = 0處加粗水平線,在刻度線標(biāo)簽附近添加垂直網(wǎng)格線,刪除x軸的標(biāo)簽,并增加y的橫向邊距-軸。
要基于你所學(xué)的知識(shí),請(qǐng)考慮以下幾個(gè)步驟:
1)為其他學(xué)士學(xué)位生成相似的圖形。
2)生成各種FTE圖:直方圖,散點(diǎn)圖等。
3)探索matplotlib的圖庫(kù),搜索可能的元素以豐富你的FTE圖(例如插入圖像或添加箭頭等)。添加圖像可以使你的FTE圖達(dá)到一個(gè)全新的水平:
填寫(xiě)下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)!怕錢(qián)不夠?可先就業(yè)掙錢(qián)后再付學(xué)費(fèi)! 怕學(xué)不會(huì)?助教全程陪讀,隨時(shí)解惑!擔(dān)心就業(yè)?一地學(xué)習(xí),可推薦就業(yè)!
?2007-2022/ m.5wd995.cn 北京漫動(dòng)者數(shù)字科技有限公司 備案號(hào): 京ICP備12034770號(hào) 監(jiān)督電話:010-53672995 郵箱:bjaaa@aaaedu.cc