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)+1 等于16 , 因为python里计数从0开始,所以i+1起始加一,# 又因为我们只有15个圆,所以我们生成的位置Y也只要十五个,所以加入限制条件<15 y1=[180for i in range(2*(len(S1)+1)) if i# 我们继续生成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设置为0plt.ylim(0,220) #限制y轴的显示大小
散点图的参数:
1. x,y表示点位置,s表示点的大小,
2. color表示颜色,可以传入一个元组,对RGB值归一
3. alpha表示的是透明度
第一圈圆
S2=np.array([2028,1976,1962,1925,1904,1833,1730,1577,1524,1493,1475,1589,1511,1505,1524])*2x2=[(0)*np.pi+np.pi/(len(S1)+1)*(i+1) for i in range(2*(len(S1)+1))]y2=[130for i in range(2*(len(S1)+1)) if i<len(S1) ]
我们用同样的方式计算出第二圈圆的位置,画出来
接着我们把柱状图也丢进极坐标掰弯
柱状图可以用四个参数来确定每个柱子的位置 H1=[56,55,54,52,51,50,49,47,43,40,37,34,31,28,24]W1=[0.05for i in range(2*(len(S1)+1)) if i<len(S1)]B=[30for 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表示柱子的宽度
import matplotlib.font_manager font=matplotlib.font_manager.FontProperties(fname='D:\\Fonts\\English\\Museo700-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)