社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

EasyCharts • 6 年前 • 893 次点击  

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

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

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




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

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

我们开始本次的临摹吧

本期的主题如下:

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

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

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

  • 熟悉一下这么自定义字体

  • 熟悉一下网格线


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


从图上可以看出来,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)+1 等于16 , 因为python里计数从0开始,所以i+1起始加一,# 又因为我们只有15个圆,所以我们生成的位置Y也只要十五个,所以加入限制条件<15
y1=[180 for 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=[130 for 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.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表示柱子的宽度

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

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

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

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)

裁掉不要的部分


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


就这样 完结 撒花✿✿ヽ(°▽°)ノ✿

大家都在看

plotnine:python数据可视化版ggplot2

Python科研统计作图Plotnine+Seaborn+matplotlib替代R ggplot2系列(1)

Python科研统计作图Plotnine+Seaborn+matplotlib替代R ggplot2系列(2)

Python Seaborn (1) 艺术化的图表控制

Python Seaborn (2) 斑驳陆离的调色板

Python Seaborn (3) 分布数据集的可视化

Python Seaborn (4) 线性关系的可视化

Python Seaborn (5) 分类数据的绘制



加入QQ群可领取: plotnine的数据可视化学习手册


如需联系EasyCharts团队

请加微信:EasyCharts


【书籍推荐】《Excel 数据之美--科学图表与商业图表的绘制》

【手册获取】国内首款-数据可视化参考手册:专业绘图必备

【必备插件】  EasyCharts -- Excel图表插件

【网易云课堂】  Excel 商业图表修炼秘笈之基础篇

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29770
 
893 次点击