有的时候在做各省数据的时候,会发现有些省份面积很小,比如北京、天津、上海这种,然后再在上面加上数值和标签,就不容易进行分辨。所以这里就介绍一下把每个省都用相同大小的六边形来概括,然后整体分布位置大概按照地图的分布排列,当然结果因此会有的省份稍微偏移,但整体是可以看明白的。
主要是plotnine结合pyplot,这里要介绍一下plotnine,后面应该会详细介绍的,对这个库还是很亲切,为什么呢?因为R里面那优雅的ggplot2包。plotnine库是基于ggplot2的,而且语法风格和ggplot2基本一样,很强大。节奏应该是把R里面的ggplot2写了,再来写pyplot。
结果就是上面这张图,数据用的是2019年各省的GDP,看上去还是很直观明了,还要颜色层次的划分,根据根据个人喜好自定义颜色。下面就是代码情况,Python实现。
先做常规的准备,导库,中文显示,读取数据↓
import osos.chdir(r"E:\Python\可视化\六边地图")import pandas as pdimport numpy as npfrom plotnine import *from pylab import mplimport matplotlib.pyplot as pltimport matplotlib.patches as mpathesfrom matplotlib.collections import PatchCollectionfrom matplotlib import cm, colorsmpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False# 禁用科学计数法pd.set_option('display.float_format', lambda x: '%.2f' % x) df = pd.read_excel('中国省份坐标31.xlsx')gdp = pd.read_excel('各省2019年GDP数据.xlsx')
这个是省份六边形的相对坐标值,一共六个边,数据统一通过下面的链接就行下载,可以用来直接用。
https://linss.oss-cn-beijing.aliyuncs.com/Python/Map/%E4%B8%AD%E5%9B%BD%E7%9C%81%E4%BB%BD%E5%9D%90%E6%A0%8731.xlsx
各省的GDP数据就是常规的省份+GDP两列,这个很简单,如下↓
下面是对数据的一些处理转换
# 计算每个省份的中心坐标df_center = df.groupby('Province').mean()
# 合并省份坐标和数据dfxy = pd.merge(df_center, gdp, on='Province', how ='left')
# 定义颜色数值color_value = np.array(dfxy.GDP)
下面就是常规的画图了,这里可以直接拿来用,要全部看明白的话,需要把matplotlib和plotnine研究一下,后面会详解的,先用着。
fig, ax = plt.subplots(figsize=(10, 9))# 设置背景颜色fig.set_facecolor('w')ax.set_facecolor('w')# 设置标题ax.set_title('\n各省2019年的GDP数据', loc='center', fontsize=26, color='#CA391F')# 循环设置每个省份patches = []for Province in np.unique(df['Province']): # 筛选每个省份的数据 dfp = df[df['Province'] == Province] # 多边形的每个位置 rect = mpathes.Polygon([(x, y) for x, y in zip(dfp['x'], dfp['y'])]) patches.append(rect) # 多边形内部显示省份名称和数据 ax.text(df_center.loc[Province].x, df_center.loc[Province].y, '\n'+Province+'\n'+'%.2f' % dfxy[dfxy['Province'] == Province].GDP.values[0], fontsize=15, va='center', ha='center', color='#CA391F')# 填充形状和颜色collection = PatchCollection(patches, alpha=0.5, cmap=plt.cm.GnBu, ec='#7CB1FF', fc='w', lw=1)collection.set_array(color_value)ax.add_collection(collection)# 隐藏边框ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.spines['left'].set_visible(False)ax.spines['bottom'].set_visible(False)# 隐藏 X、Y 轴ax.xaxis.set_visible(False)ax.yaxis.set_visible(False)# 避免变形plt.axis('equal')plt.margins(0,0)plt.show()plt.savefig(f'Last30Days_equipment.png',bbox_inches='tight')
End