第一次寫(xiě)教程的,,python小白,求不噴,,求大神指點(diǎn)指點(diǎn) 之前看了很多關(guān)于繪制玫瑰圖的教程,有基于R的ggplot2的或者用AI的藝術(shù)畫(huà)筆做的,,但是似乎很少有用malplotlib來(lái)做,,最近剛好研究下matplotlib里的極坐標(biāo)的用法,于是模仿著一些圖,,嘗試了一下畫(huà)玫瑰圖,,感覺(jué)效果還行。先Po原圖和成品 以下是嘗試模仿的成品: emmmm,,差不多 差不多就行,,哈哈哈 100%還原太麻煩了 文字的和其他的修飾,作者實(shí)在嫌麻煩,,有興趣的朋友,,可以自己嘗試一下 下面進(jìn)入教學(xué)時(shí)間,大家鼓掌 1.什么是玫瑰圖 玫瑰圖,,玫瑰圖,,就是長(zhǎng)得像玫瑰一樣美麗的圖(一耳光,pia扇飛了,,不要說(shuō)廢話(huà)) emmm,玫瑰圖其實(shí)就是被掰彎了的柱狀圖(o(*////▽////*)q的捂臉) 2.怎么掰彎了個(gè)筆直的柱狀圖 用愛(ài)(又是一耳光,,能不能正經(jīng)點(diǎn)這位作者) emmm, 把在笛卡爾坐標(biāo)系里的柱狀圖,畫(huà)到極坐標(biāo)系去 3.什么是極坐標(biāo) 長(zhǎng)這樣: 傳統(tǒng)的笛卡爾坐標(biāo)是這樣的: 笛卡爾坐標(biāo)系中,,靠x,y兩個(gè)值能確定一個(gè)點(diǎn)的位置,,而在極坐標(biāo)中,考的是r(半徑),θ(角度)來(lái)確定一個(gè)點(diǎn)的位置,。 知識(shí)點(diǎn):想把柱狀圖從笛卡爾家搬到極坐標(biāo)家去,,重要的就是算好θ 4.先畫(huà)一個(gè)90度半圓 為了能打好基礎(chǔ),我們先來(lái)畫(huà)個(gè)如下半圓,。 import numpy as np 可以很清楚的發(fā)現(xiàn) 對(duì)應(yīng)到笛卡爾坐標(biāo)系中,,left決定了扇形的中線(xiàn)位置,,然后height決定扇形的長(zhǎng)度,bottom決定了下邊界,,width決定了扇形的寬度,。 能在目標(biāo)位置畫(huà)上一個(gè)扇形,基本上我們就能開(kāi)始畫(huà)玫瑰圖辣,!回到我們的例子中來(lái) 這個(gè)圖由十個(gè)大扇形構(gòu)成底圖,,然后中間在加上2個(gè)小的扇形。 所以先計(jì)算,,十個(gè)大扇形的位置,,思路大概是,把一個(gè)圓分成十份,,然后找到十個(gè)扇形中線(xiàn)對(duì)應(yīng)的θ,。 x1=[np.pi/10+np.pi*i/5 for i in range(1,11)] 然后在計(jì)算20個(gè)小扇形的位置 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值就隨機(jī)生成了 先畫(huà)第一層,,最外圈的放文字的位置,。 為了能畫(huà)出線(xiàn)來(lái),作者用重疊的方式,,先畫(huà)個(gè)半徑是7000,在畫(huà)個(gè)半徑是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)) 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)) 然后我們?cè)诋?huà)中間的 最后在在中間畫(huà)一個(gè)白色的小圓 y6=[2000 for i in range(0,10)]ax.bar(left=x1, height=y6,width=np.pi/5,color='w',edgecolor='w') 大功告成,,撒花 本文已由原作者授權(quán) |
|
來(lái)自: 萌小芊 > 《統(tǒng)計(jì)》