matplotlib 散点图进阶
依旧是前一篇随笔中中国城市gdp的排名数据。本次用matplotlib 散点图scatter 绘图。代码分别如下,也见github地址。
首先,不经过优化的散点图画出来是这样的,x轴为gdp数值,y轴为城市,按照gdp数值排序。看上去真的平平无奇。
优化思路:
1.去掉画布外框
2.去掉坐标轴刻度横线
3.圆点根据gdp排名大小设置面积大小
4.配置不同颜色...
优化后的两个版本是下面这样的
图一
图二
全都是根据matplotlib axis , plot ,scatter 参数设置。
图一实现代码:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为`a方块的问题 """准备数据""" data=pd.DataFrame(data={'rank':[10,9, 8, 7, 6, 5, 4, 3, 2, 1], 'city':['杭州','武汉', '成都', '苏州', '重庆', '天津', '广州', '深圳', '北京', '上海'], 'GDP':[6949,6949, 7702, 9548, 10335, 10371, 11756, 12134, 15212, 16410]}) #散点大小 ,由GDP数值归一化到0-500 data['size']=data['GDP']*500/(data['GDP'].max()-data['GDP'].min()) #圆点颜色值 rgb十六进制 data['color']=['#FFBA08', '#FAA307', '#F48C06', '#E85D04', '#DC2F02', '#D00000', '#9D0208', '#6A040F', '#370617', '#03071E'] #圆点Y值 data['Y']=10-data['rank'] fig,ax=plt.subplots(1,1,dpi=300) #隐藏y轴 ax.get_yaxis().set_visible(False) #将刻度小横线设置为白色,标签颜色为黑色 plt.tick_params(axis='x',color='w',labelcolor='#3d405b') #x,y轴刻度范围 ax.set_xlim(6000,18001) ax.set_xticks(range(4000,19000,2000)) ax.set_ylim(-1,10) #画 x,y水平线,设置颜色,线类型,和线宽度 for i in range(6000,19000,2000): ax.axvline(x=i,c="gray",ls="-",lw=0.1) for y in range(10): ax.axhline(y=y,c="gray",ls="-",lw=0.1) #画散点图,传入s参数,绘制不同面积的圆点 ax.scatter('GDP', 'city', c='color', s='size', data=data) #c : color s :size 这里传入了序列 #标注圆点文字,设置圆点内文字大小,gdp越高文字越大 data['text_size']=[9,9,9,10,10,11,11,11,12,12] for rank,city in zip(data['rank'],data['city']): gdp=data[data['city']==city]['GDP'] text_size=data[data['city']==city]['text_size'] ax.text(gdp-500*text_size/12,10-rank-0.1,city,fontdict={'color':'w','size':text_size},fontweight='heavy') #去掉上下左右外框 for i in ['top','right','left','bottom']: ax.spines[i].set_visible(False) plt.title("2019上半年中国城市GDP(亿元)排名") plt.savefig("城市GDP2.png") plt.show()
图二实现代码:
import pandas as pd import numpy as np import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体 mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为`a方块的问题 """准备数据""" data=pd.DataFrame(data={'rank':[10,9, 8, 7, 6, 5, 4, 3, 2, 1], 'city':['杭州','武汉', '成都', '苏州', '重庆', '天津', '广州', '深圳', '北京', '上海'], 'GDP':[6949,6949, 7702, 9548, 10335, 10371, 11756, 12134, 15212, 16410]}) #散点大小 ,由GDP数值归一化到0-500 data['size']=data['GDP']*500/(data['GDP'].max()-data['GDP'].min()) #圆点颜色值 rgb十六进制 data['color']=['#FFBA08', '#FAA307', '#F48C06', '#E85D04', '#DC2F02', '#D00000', '#9D0208', '#6A040F', '#370617', '#03071E'] #圆点Y值 data['Y']=10-data['rank'] #开始画图 fig,ax=plt.subplots(1,1,dpi=300) #将刻度小横线设置为白色,标签颜色为深蓝色 plt.tick_params(axis='x',color='w',labelcolor='#3d405b') plt.tick_params(axis='y',color='w',labelcolor='#3d405b') #x,y轴刻度范围 ax.set_xlim(6000,18001) ax.set_xticks(range(4000,19000,2000)) # y轴标签 ylabels=data['city'].tolist() ax.set_ylim(-1,10) ax.set_yticklabels(ylabels) #画 x,y水平线,设置颜色,线类型,和线宽度 for i in range(6000,19000,2000): ax.axvline(x=i,c="gray",ls="-",lw=0.3) for y in range(10): ax.axhline(y=y,c="gray",ls="-",lw=0.3) #画散点图 设置圆点内文字大小,gdp越高文字越大 ax.scatter('GDP', 'city', c='color', s='size', data=data) #c : color s :size 这里传入了序列 #隐藏上下左右外边框 for i in ['top','right','left','bottom']: ax.spines[i].set_visible(False) plt.title("2019上半年中国城市GDP(亿元)排名") plt.savefig("城市GDP.png") plt.show() plt.close()
作者:chenboshi
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。