python画气泡图_​用Python把图做的好看点:用Matplotlib画个好看的气泡图

原标题:​用Python把图做的好看点:用Matplotlib画个好看的气泡图

此文于2019-01-06发表在EasyCharts-知乎专栏:Python数据分析与可视化

https://zhuanlan.zhihu.com/EasyCharts-Python

这系列文章就是下面这位身高180、帅气的小哥哥撰写,人长得好看,画的图也好看!

6e89213acef54319872b0fbb46afeede.jpeg

我们继续来把简单的图形丢到极坐标,这次是气泡图和柱状图,临摹的对象是澎湃美数课

041154ecc1be47ca9c92e77bd445370a.jpeg

这个图看起来很好看,原理其实很简单,把柱状图和气泡图从笛卡尔坐标系中转移到极坐标系中来就OK

我们开始本次的临摹吧

本期的主题如下:

熟悉一下柱状图的一些参数

熟悉一下散点图的一些参数

熟悉一下极坐标系的规则(高中内容啦)

熟悉一下这么自定义字体

熟悉一下网格线

我们先来说说及极坐标内,一个点位置该怎么表示:(笔者很懒惰,就直接从网上复制图片来教学了)

65cde4cd0e214c07aaab8593dc4aeff0.jpeg

从图上可以看出来,x轴为那个带箭头的线,matplotlib中也一样,极坐标的起点在同样的位置,不过在matplotlib里 x表示的是角度,y表示的长度,所以确定好夹角θ,和半径长度就OK

我们在看看 美术课里这个样图,一排上,一共有15个圆,且最后一个和第一个没有在90°与270°的位置上,所以我们要把圆分成36份,也就是每份是2π/36

这样我们就可以确定等差数列了,我们以3/2π为起点,不断加2π/36

我们来画第一圈圆

importnumpy asnp

importmatplotlib.pyplot asplt

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) fori inrange(2*(len(S1)+1)) ifi

y1=[180fori inrange(2*(len(S1)+1)) ifi

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表示的是透明度

9df211c810ed4a209498a3980b5b20fa.jpeg

第一圈圆

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) fori in range(2*(len(S1)+1))]y2=[130fori in range(2*(len(S1)+1)) ifi

我们用同样的方式计算出第二圈圆的位置,画出来

256385f02bdc4470856a42d08337d74f.jpeg

接着我们把柱状图也丢进极坐标掰弯

柱状图可以用四个参数来确定每个柱子的位置H1=[56,55,54,52,51,50,49,47,43,40,37,34,31,28,24]W1=[0.05fori in range(2*(len(S1)+1)) ifi

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

x表示x轴的位置,bottom表示柱子最底端的位置height表示 柱子的长度width表示柱子的宽度

112cb36304c348bbb1f5a77bfc4aa837.jpeg

最后我们把 坐标上的线,还有坐标轴上的文字去掉,以及背后画个网格线,

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

4aa94977898e4ec29b21eb03e3497af0.jpeg

最后我们选择喜欢的字体,然后打上数据标签,并保存

importmatplotlib.font_managerfont=matplotlib.font_manager.FontProperties(fname='D:FontsEnglishMuseo700-Regular.otf')fori 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)fori 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)fori 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)

裁掉不要的部分

46812ff8f41f493bb99ffa5200137912.jpeg

笔者比较懒惰,就在搞那些文字与标题啦,如果要加文字与标题的话可以保存eps格式的矢量图文件,放在AI里进行深度的加工和处理哦

就这样 完结 撒花✿✿ヽ(°▽°)ノ✿返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值