天天看點

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

我們繼續來把簡單的圖形丢到極坐标,這次是氣泡圖和柱狀圖,臨摹的對象是澎湃美數課

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

這個圖看起來很好看,原理其實很簡單,把柱狀圖和氣泡圖從笛卡爾坐标系中轉移到極坐标系中來就OK

我們開始本次的臨摹吧

本期的主題如下:

  • 熟悉一下柱狀圖的一些參數
  • 熟悉一下散點圖的一些參數
  • 熟悉一下極坐标系的規則(高中内容啦)
  • 熟悉一下這麼自定義字型
  • 熟悉一下網格線

我們先來說說及極坐标内,一個點位置該怎麼表示:(筆者很懶惰,就直接從網上複制圖檔來教學了)

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

從圖上可以看出來,x軸為那個帶箭頭的線,matplotlib中也一樣,極坐标的起點在同樣的位置,不過在matplotlib裡 x表示的是角度,y表示的長度,是以确定好夾角θ,和半徑長度就OK

我們在看看 美術課裡這個樣圖,一排上,一共有15個圓,且最後一個和第一個沒有在90°與270°的位置上,是以我們要把圓分成36份,也就是每份是2π/36

這樣我們就可以确定等差數列了,我們以3/2π為起點,不斷加2π/36

我們來畫第一圈圓

import numpy as np 
import matplotlib.pyplot as plt


S1=np.array([2572,2483,2302,2125,1990,1853,1694,1400,1134,982,869,776,668,584,480])*2
#為了把圖做大一點,把圓擴大了一倍
x1=[(3/2)*np.pi+np.pi/(len(S1)+1)*(i+1) for i in range(2*(len(S1)+1)) if i<len(S1)]
# len(S1)+1 等于16 , 因為python裡計數從0開始,是以i+1起始加一,
# 又因為我們隻有15個圓,是以我們生成的位置Y也隻要十五個,是以加入限制條件<15

y1=[180 for i in range(2*(len(S1)+1)) if i<len(S1) ]
# 我們繼續生成15個y值,這樣一來,我們三個參數都确定了,氣泡了x軸位置,y軸位置,以及氣泡大小
# 下面開始畫圖

fig=plt.figure(figsize=(13.44*2,7.5*2),facecolor='w')#建立一個畫布
ax = fig.add_subplot(111,projection='polar',facecolor='w')#建立一個坐标系,projection='polar'表示極坐标
ax.scatter(x=x1,y=y1,s=S1,color=(180/255,204/255,30/255),alpha=0.5,linewidths=0) #不要氣泡有邊框線,我們把linewidth設定為0
plt.ylim(0,220) #限制y軸的顯示大小
 

散點圖的參數:
1. x,y表示點位置,s表示點的大小,
2. color表示顔色,可以傳入一個元組,對RGB值歸一
3. alpha表示的是透明度 

           
python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

第一圈圓

S2=np.array([2028,1976,1962,1925,1904,1833,1730,1577,1524,1493,1475,1589,1511,1505,1524])*2
x2=[(0)*np.pi+np.pi/(len(S1)+1)*(i+1) for i in range(2*(len(S1)+1))]
y2=[130 for i in range(2*(len(S1)+1)) if i<len(S1) ]
           

我們用同樣的方式計算出第二圈圓的位置,畫出來

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

接着我們把柱狀圖也丢進極坐标掰彎

柱狀圖可以用四個參數來确定每個柱子的位置

H1=[56,55,54,52,51,50,49,47,43,40,37,34,31,28,24]
W1=[0.05 for i in range(2*(len(S1)+1)) if i<len(S1)]
B=[30 for i in range(2*(len(S1)+1)) if i<len(S1)]

ax.bar(x=x1, height=H1, width=W1,bottom=B,color=(255/255,171/255,1/255))

x表示x軸的位置,
bottom表示柱子最底端的位置
height表示 柱子的長度
width表示柱子的寬度
           
python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

最後我們把 坐标上的線,還有坐标軸上的文字去掉,以及背後畫個網格線,

ax.spines['polar'].set_visible(False) #去掉坐标軸的為外面一層 粗的線

plt.grid(color='gray', linestyle=':', linewidth=1,which='major',axis='x',alpha=0.1) #添加網格線

ax.set_yticks([]) #去掉 y軸上的文字

ax.set_xticks(x2) # 應為網格線是跟着x軸走的,如果去掉x軸的話,網格線也就沒了

ax.tick_params(axis='x',labelsize=0) #因為我們保留了x軸,x軸上的文字會存在,是以把x軸上的文字大小設定為0

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

最後我們選擇喜歡的字型,然後打上資料标簽,并儲存

import matplotlib.font_manager  
font=matplotlib.font_manager.FontProperties(fname='D:FontsEnglishMuseo700-Regular.otf')

for i in range(len(x1)):
    ax.text(x=x1[i],y=y1[i],s=S1[i],color='gray',ha='center', va= 'center',fontsize=12,fontproperties=font)
for i in range(len(x1)):
    ax.text(x=x1[i],y=y2[i],s=S2[i],color='gray',ha='center', va= 'center',fontsize=12,fontproperties=font)
for i in range(len(x1)):
    ax.text(x=x1[i],y=H1[i]+40,s="{}%".format(H1[i]) ,color='gray',ha='center', va= 'center',fontsize=12,fontproperties=font)

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

裁掉不要的部分

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

筆者比較懶惰,就在搞那些文字與标題啦,如果要加文字與标題的話可以儲存eps格式的矢量圖檔案,放在AI裡進行深度的加工和處理哦

就這樣 完結 撒花✿✿ヽ(°▽°)ノ✿

基礎的部分可以看看這個文章:

Mono Lee:Python入門向:Matplotlib自救指南篇,從此做圖不求人(一)​zhuanlan.zhihu.com

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

其他在極坐标裡的畫圖可以看看這個

Mono Lee:用Python把圖做的好看點:用Matplotlib畫個環形圖​zhuanlan.zhihu.com

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

Mono Lee:用Python把圖做的好看點:用Matplotlib畫個玫瑰圖​zhuanlan.zhihu.com

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...

Mono Lee:用Python把圖做的好看點:用Matplotlib做個像麥肯錫一樣的條形圖​zhuanlan.zhihu.com

python 柱狀圖上顯示字型_?用Python把圖做的好看點:用Matplotlib畫個好看的氣泡圖...