天天看點

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

原标題:Python可視化:用Matplotlib畫個玫瑰圖

第一次寫教程的,python小白,求不噴,求大神指點指點

之前看了很多關于繪制玫瑰圖的教程,有基于R的ggplot2的或者用AI的藝術畫筆做的,但是似乎很少有用malplotlib來做,最近剛好研究下matplotlib裡的極坐标的用法,于是模仿着一些圖,嘗試了一下畫玫瑰圖,感覺效果還行。先Po原圖和成品

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

網易數獨的

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

DT财經的

以下是嘗試模仿的成品:

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖
python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

emmmm,差不多 差不多就行,哈哈哈 100%還原太麻煩了

文字的和其他的修飾,作者實在嫌麻煩,有興趣的朋友,可以自己嘗試一下

下面進入教學時間,大家鼓掌

1.什麼是玫瑰圖

玫瑰圖,玫瑰圖,就是長得像玫瑰一樣美麗的圖(一耳光,pia扇飛了,不要說廢話)

emmm,玫瑰圖其實就是被掰彎了的柱狀圖(o(*▽*)q的捂臉)

2.怎麼掰彎了個筆直的柱狀圖

用愛(又是一耳光,能不能正經點這位作者)

emmm, 把在笛卡爾坐标系裡的柱狀圖,畫到極坐标系去

3.什麼是極坐标

長這樣:

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

一個裝逼的圓形

傳統的笛卡爾坐标是這樣的:

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

最熟悉的陌生人

笛卡爾坐标系中,靠x,y兩個值能确定一個點的位置,而在極坐标中,考的是r(半徑),θ(角度)來确定一個點的位置。

知識點:想把柱狀圖從笛卡爾家搬到極坐标家去,重要的就是算好θ

4.先畫一個90度半圓

為了能打好基礎,我們先來畫個如下半圓。

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

importnumpyasnp

importmatplotlib.pyplotasplt

y=20

x=np.pi/2

w=np.pi/2

color=(206/255,32/255,69/255)

edgecolor=(206/255,32/255,69/255)

fig=plt.figure(figsize=(13.44,7.5))#建立一個畫布

ax=fig.add_subplot(111,projection='polar')#建立一個坐标系,projection='polar'表示極坐标

ax.bar(left=x,height=y,width=w,bottom=10,color=color,edgecolor=color)

fig.savefig('E:test.png',dpi=400,bbox_inches='tight',transparent=True)

可以很清楚的發現

在笛卡爾坐标系中,一個柱狀圖由left,bottom,height,width四個參數決定位置和大小left決定了左邊界,bottom決定了下邊界,height決定了長度,width決定了寬度.

對應到笛卡爾坐标系中,left決定了扇形的中線位置,然後height決定扇形的長度,bottom決定了下邊界,width決定了扇形的寬度。

能在目标位置畫上一個扇形,基本上我們就能開始畫玫瑰圖辣!回到我們的例子中來

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

我們來分析一下

這個圖由十個大扇形構成底圖,然後中間在加上2個小的扇形。

是以先計算,十個大扇形的位置,思路大概是,把一個圓分成十份,然後找到十個扇形中線對應的θ。

x1=[np.pi/10+np.pi*i/5 for i in range(1,11)]

然後在計算20個小扇形的位置

x2=[np.pi/20+np.pi*i/5 for i in range(1,11)]x3=[3*np.pi/20+np.pi*i/5 for i in range(1,11)]

由于作者很怕麻煩,是以y值就随機生成了

先畫第一層,最外圈的放文字的位置。

為了能畫出線來,作者用重疊的方式,先畫個半徑是7000,在畫個半徑是6000,然後

x1=[np.pi/10+np.pi*i/5 for i in range(1,11)]x2=[np.pi/20+np.pi*i/5 for i in range(1,11)]x3=[3*np.pi/20+np.pi*i/5 for i in range(1,11)]y1=[7000 for i in range(0,10)]y2=[6000 for i in range(0,10)]fig=plt.figure(figsize=(13.44,7.5))ax = fig.add_subplot(111,projection='polar')ax.axis('off')ax.bar(left=x1, height=y1,width=np.pi/5,color=(220/255,222/255,221/255),edgecolor=(204/255,206/255,205/255))ax.bar(left=x1, height=y2,width=np.pi/5,color='w',edgecolor=(204/255,206/255,205/255))

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

random.seed(100)y4=[random.randint(4000,5500) for i in range(10)]y5=[random.randint(3000,5000) for i in range(10)]ax.bar(left=x2, height=y4,width=np.pi/10,color=(206/255,32/255,69/255),edgecolor=(206/255,32/255,69/255))ax.bar(left=x3, height=y5,width=np.pi/10,color=(34/255,66/255,123/255),edgecolor=(34/255,66/255,123/255))

然後我們在畫中間的

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

最後在在中間畫一個白色的小圓

y6=[2000 for i in range(0,10)]ax.bar(left=x1, height=y6,width=np.pi/5,color='w',edgecolor='w')

python用matplotlib畫玫瑰_Python可視化:用Matplotlib畫個玫瑰圖

大功告成,撒花

本文已由原作者授權

如需轉載請聯系EasyCharts團隊!傳回搜狐,檢視更多

責任編輯: