該可視化顯示了1850年至1900年平均溫度的偏差。它在Twitter和Facebook上被轉(zhuǎn)發(fā)了數(shù)百萬(wàn)次,甚至在里約奧運(yùn)會(huì)開(kāi)幕式上也顯示了該版本的版本??梢暬浅R俗⒛?,因?yàn)樗梢詭椭^眾了解變化的溫度波動(dòng)以及過(guò)去30年平均溫度的總體急劇上升。您可以在Ed Hawkins的網(wǎng)站上詳細(xì)了解這種可視化背后的動(dòng)機(jī)。在大數(shù)據(jù)分析Python生成氣候溫度螺旋模型中,我們將逐步介紹如何在Python中重新創(chuàng)建動(dòng)畫效果。我們將專門處理pandas(用于表示和修改數(shù)據(jù))和matplotlib(用于可視化數(shù)據(jù))。如果您不熟悉matplotlib,我們建議您仔細(xì)閱讀通過(guò)數(shù)據(jù)可視化課程探索數(shù)據(jù)可視化和講故事。在大數(shù)據(jù)分析Python生成氣候溫度螺旋模型中,我們將使用以下庫(kù):
1)Python 3.6
2)pandas0.22
3)Matplotlib 2.2.2
數(shù)據(jù)清理
基本數(shù)據(jù)由國(guó)外的數(shù)據(jù)發(fā)布,數(shù)據(jù)集可以直接下載
在這里。Github上的openclimatedata存儲(chǔ)庫(kù)在此筆記本中包含一些有用的數(shù)據(jù)清理代碼。您需要向下滾動(dòng)到標(biāo)題為Global Temperatures的部分。以下代碼將文大數(shù)據(jù)分析Python生成氣候溫度螺旋模型件讀取到pandas數(shù)據(jù)框中:
然后,我們需要:
1)將第一列拆分為month和year列
2)重命名1列value
3)選擇并保存除第一列(0)以外的所有內(nèi)容
保留我們的數(shù)據(jù)
tidy,讓我們刪除包含2018年數(shù)據(jù)的行(因?yàn)檫@是唯一包含3個(gè)月而非全部12個(gè)月數(shù)據(jù)的年份)。
最后,讓我們計(jì)算1850到1900年全球溫度的平均值,然后從整個(gè)數(shù)據(jù)集中減去該值。為了簡(jiǎn)化此操作,我們將創(chuàng)建一個(gè)
使用year和month列的multiindex:
這樣,我們只修改了
value列(實(shí)際溫度值)。最后,計(jì)算并減去1850至1900年的平均溫度,然后將索引重新設(shè)置為以前的水平。
直角坐標(biāo)系與極坐標(biāo)系
重建Ed的GIF有幾個(gè)關(guān)鍵階段:
1)學(xué)習(xí)如何繪制極坐標(biāo)系
2)轉(zhuǎn)換數(shù)據(jù)以進(jìn)行極地可視化
3)定制情節(jié)的美學(xué)
4)逐年逐步完成可視化并將圖變成GIF
我們將開(kāi)始研究在
極坐標(biāo)系。您可能已經(jīng)看到的大多數(shù)圖(條形圖,箱形圖,散點(diǎn)圖等)都位于笛卡爾坐標(biāo)系中。在此系統(tǒng)中:
1)x和y(和z)的范圍可以從負(fù)無(wú)窮大到正無(wú)窮大(如果我們堅(jiān)持實(shí)數(shù))
2)中心坐標(biāo)為(0,0)
3)我們可以認(rèn)為這個(gè)系統(tǒng)是矩形的
相反,極坐標(biāo)系是圓形的,使用r和theta。所述r坐標(biāo)規(guī)定了從中心的距離和范圍可以從0到無(wú)窮大。所述theta坐標(biāo)指定從原點(diǎn)的角度可以從0到2 * pI范圍。
要了解有關(guān)極坐標(biāo)系統(tǒng)的更多信息,建議您深入以下鏈接:
1)維基百科:極坐標(biāo)系
2)NRICH:極坐標(biāo)簡(jiǎn)介
為極坐標(biāo)圖準(zhǔn)備數(shù)據(jù)
首先,讓我們了解一下如何在Ed Hawkins的原始?xì)夂蚵菪龍D中繪制數(shù)據(jù)。一年的溫度值幾乎跨越了整個(gè)螺旋/圈。您會(huì)注意到該行從一月到十二月的跨度,但不再連接到一月。這只是GIF的1850幀:
這意味著我們需要按年份對(duì)數(shù)據(jù)進(jìn)行子集化,并使用以下坐標(biāo):
1)r:給定月份的溫度值,調(diào)整為不包含負(fù)值。
a)Matplotlib支持繪制負(fù)值,但不支持您的思維方式。我們希望-0.1比0.1更靠近中心,這不是默認(rèn)的matplotlib行為。
b)我們還希望在繪圖原點(diǎn)周圍留一些空間,以將年份顯示為文本。
2)theta:生成12個(gè)等距角度值,范圍從0到2 * pi。
讓我們深入研究如何在matplotlib中僅繪制1850年的數(shù)據(jù),然后擴(kuò)展到所有年份。如果您不熟悉在matplotlib中創(chuàng)建Figure和Axes對(duì)象,建議您使用
數(shù)據(jù)可視化探索課程。要生成使用極坐標(biāo)系統(tǒng)的matplotlib Axes對(duì)象,我們需要在創(chuàng)建projection參數(shù)"polar"時(shí)將其設(shè)置為。
默認(rèn)極坐標(biāo)圖如下所示:
要調(diào)整數(shù)據(jù)以使其不包含負(fù)溫度值,我們首先需要計(jì)算最小溫度值:
讓我們添加
1 所有溫度值,因此它們將為正,但在原點(diǎn)周圍仍有一些空間可顯示文本:
我們還生成從0到2 * pi的12個(gè)均勻間隔的值,并使用前12個(gè)作為theta值:
要在極坐標(biāo)投影上繪制數(shù)據(jù),我們?nèi)匀皇褂?br />
Axes.plot()方法,但現(xiàn)在第一個(gè)值對(duì)應(yīng)于theta值列表,第二個(gè)值對(duì)應(yīng)于r值列表。
這是這個(gè)情節(jié)的樣子:
調(diào)整美學(xué)
為了使我們的情節(jié)接近埃德·霍金斯(Ed Hawkins),讓我們調(diào)整一下美學(xué)。在笛卡爾坐標(biāo)系上正常繪制時(shí),我們習(xí)慣于使用其他大多數(shù)matplotlib方法。在內(nèi)部,matplotlib考慮
theta成為x和r成為y。為了了解這一點(diǎn),我們可以使用以下命令隱藏兩個(gè)軸的所有刻度標(biāo)簽:
現(xiàn)在,讓我們調(diào)整顏色。我們需要極坐標(biāo)圖中的背景顏色為黑色,而極坐標(biāo)周圍的顏色為灰色。實(shí)際上,我們使用了圖像編輯工具來(lái)查找確切的黑色和灰色顏色值,如下所示
十六進(jìn)制值:
1)灰色:#323331
2)黑色:#000100
我們可以用
fig.set_facecolor()設(shè)置圖的前景色和Axes.set_axis_bgcolor()背景色:
接下來(lái),讓我們使用添加標(biāo)題
Axes.set_title():
最后,讓我們?cè)谥虚g添加文本,以指定要顯示的當(dāng)前年份。我們希望此文本是起源
(0,0),我們希望文本為白色,大字體并水平居中對(duì)齊。
這是該地塊現(xiàn)在的樣子(回想一下這只是1850年的情況)。
繪制剩余年份
要繪制剩余年份的螺旋線,我們需要重復(fù)數(shù)據(jù)集中所有年份以外的操作。我們應(yīng)該在此處進(jìn)行的一項(xiàng)調(diào)整是手動(dòng)設(shè)置
r(或y在matplotlib中)。這是因?yàn)閙atplotlib根據(jù)使用的數(shù)據(jù)自動(dòng)縮放繪圖的大小。因此,在最后一步中,我們觀察到僅1850的數(shù)據(jù)顯示在繪圖區(qū)域的邊緣。讓我們計(jì)算整個(gè)數(shù)據(jù)集中的最大溫度值,并添加大量的填充(以匹配Ed所做的操作)。
我們可以使用以下方式手動(dòng)設(shè)置y軸限制
Axes.set_ylim()
現(xiàn)在,我們可以使用for循環(huán)來(lái)生成其余數(shù)據(jù)。讓我們省去暫時(shí)生成中心文本的代碼(否則每年將在同一點(diǎn)生成文本,這將非?;靵y):
該圖如下所示:
自定義顏色
現(xiàn)在,顏色感覺(jué)有些隨意,與原始可視化效果很好地傳達(dá)出的氣候逐漸變熱不符。在原始外觀中,顏色從藍(lán)色/紫色過(guò)渡到綠色,再過(guò)渡到黃色。這種配色方案被稱為
順序顏色圖,因?yàn)轭伾臐u變反映了數(shù)據(jù)中的某些含義。雖然在matplotlib中創(chuàng)建散點(diǎn)圖時(shí)很容易指定顏色圖(使用cm來(lái)自的參數(shù)Axes.scatter(),但是在創(chuàng)建線圖時(shí)沒(méi)有直接參數(shù)來(lái)指定顏色圖。Tony Yu撰寫了一篇很棒的簡(jiǎn)短文章,介紹了如何在生成色圖時(shí)使用顏色圖散點(diǎn)圖,我們將在這里使用。本質(zhì)上,我們?cè)谡{(diào)用方法時(shí)使用color(或c)參數(shù)Axes.plot()并從中繪制顏色,plt.cm.(index)這是我們使用色圖的方式viridis:
這將導(dǎo)致繪圖具有從藍(lán)色到綠色的連續(xù)顏色,但是要變?yōu)辄S色,我們實(shí)際上可以將計(jì)數(shù)器變量乘以
2:
讓我們重新格式化我們的代碼以合并此順序顏色圖。
結(jié)果圖如下所示:
添加溫度環(huán)
盡管我們現(xiàn)在所擁有的圖很漂亮,但是查看者實(shí)際上根本無(wú)法理解基礎(chǔ)數(shù)據(jù)。在可視化過(guò)程中的任何地方都沒(méi)有指示底層溫度值的跡象。原始可視化效果在0.0、1.5和2.0攝氏度下具有完整,均勻的環(huán),以幫助解決此問(wèn)題。因?yàn)槲覀兲砑恿?br />
1對(duì)于每個(gè)溫度值,在繪制這些均勻環(huán)時(shí),我們也需要在此處做同樣的事情。藍(lán)色環(huán)原先為0.0攝氏度,因此我們需要在處生成一個(gè)環(huán)r=1。第一個(gè)紅色環(huán)原為1.5,因此我們需要將其繪制為2.5。最后一個(gè)為2.0,因此必須為3.0。
最后,我們可以添加指定環(huán)的溫度值的文本。所有這些文本值中的所有3個(gè)均處于0.5 * pi角度,并且距離值不同:
因?yàn)?ldquo; 0.5 C”的文本被數(shù)據(jù)遮蓋了,所以我們可能要考慮為靜態(tài)繪圖版本隱藏它。
生成GIF動(dòng)畫
現(xiàn)在,我們準(zhǔn)備從繪圖中生成GIF動(dòng)畫。動(dòng)畫是一系列連續(xù)顯示的圖像。我們將使用
matplotlib.animation.FuncAnimation功能來(lái)幫助我們。要利用此功能,我們需要編寫以下代碼:
1)定義基本圖的外觀和屬性
2)使用新數(shù)據(jù)更新每幀之間的繪圖
調(diào)用時(shí),我們將使用以下必需的參數(shù)
FuncAnimation():
1)fig:matplotlib Figure對(duì)象
2)func:每幀之間調(diào)用的更新函數(shù)
3)frames:幀數(shù)(我們希望每年一幀)
4)interval:每幀顯示的毫秒數(shù)(每秒有1000毫秒)
此函數(shù)將返回一個(gè)
matplotlib.animation.FuncAnimation對(duì)象,它具有一種save()可用于將動(dòng)畫寫入GIF文件的方法。以下是一些基本代碼,它們反映了我們將使用的工作流程:
現(xiàn)在剩下的就是重新格式化我們之前的代碼,并將其添加到上面的框架中。我們鼓勵(lì)您自己執(zhí)行此操作,以練習(xí)使用matplotlib進(jìn)行編程。
這是最終動(dòng)畫在較低分辨率下的樣子(以減少加載時(shí)間)。
下一步
在大數(shù)據(jù)分析Python生成氣候溫度螺旋模型中,我們探討了:
1)如何在極坐標(biāo)系上繪圖
2)如何在極坐標(biāo)圖中自定義文本
3)如何通過(guò)內(nèi)插多個(gè)圖來(lái)生成GIF動(dòng)畫
您將獲得大部分方式來(lái)重建最初發(fā)布的出色的氣候螺旋GIF Ed Hawkins。以下是我們沒(méi)有探索的一些關(guān)鍵事項(xiàng),但是我們強(qiáng)烈建議您自己進(jìn)行:
1)將月值添加到極坐標(biāo)圖的外緣
2)創(chuàng)建動(dòng)畫時(shí),將當(dāng)前年份值添加到圖的中心。
2.1)如果嘗試使用該FuncAcnimation()方法執(zhí)行此操作,則會(huì)注意到年份值相互堆疊(而不是清除上一年的值并顯示新的年份值)。
3)在圖的左下角和右下角添加文本簽名。
4)調(diào)整0.0 C,1.5 C和2.0 C的文字與靜態(tài)溫度環(huán)的交叉方式。
填寫下面表單即可預(yù)約申請(qǐng)免費(fèi)試聽(tīng)!怕錢不夠?可先就業(yè)掙錢后再付學(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