有的时候在做各省数据的时候,会发现有些省份面积很小,比如北京、天津、上海这种,然后再在上面加上数值和标签,就不容易进行分辨。所以这里就介绍一下把每个省都用相同大小的六边形来概括,然后整体分布位置大概按照地图的分布排列,当然结果因此会有的省份稍微偏移,但整体是可以看明白的。

  主要是plotnine结合pyplot,这里要介绍一下plotnine,后面应该会详细介绍的,对这个库还是很亲切,为什么呢?因为R里面那优雅的ggplot2包。plotnine库是基于ggplot2的,而且语法风格和ggplot2基本一样,很强大。节奏应该是把R里面的ggplot2写了,再来写pyplot。

数据可视化 六边形 六边形数据图 excel_excel python 形状

  结果就是上面这张图,数据用的是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')

数据可视化 六边形 六边形数据图 excel_数据_02

  这个是省份六边形的相对坐标值,一共六个边,数据统一通过下面的链接就行下载,可以用来直接用。

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两列,这个很简单,如下↓

数据可视化 六边形 六边形数据图 excel_数据_03

  下面是对数据的一些处理转换

# 计算每个省份的中心坐标df_center = df.groupby('Province').mean()

数据可视化 六边形 六边形数据图 excel_中文显示_04

# 合并省份坐标和数据dfxy = pd.merge(df_center, gdp, on='Province', how ='left')

数据可视化 六边形 六边形数据图 excel_中文显示_05

# 定义颜色数值color_value = np.array(dfxy.GDP)

数据可视化 六边形 六边形数据图 excel_Python_06

  下面就是常规的画图了,这里可以直接拿来用,要全部看明白的话,需要把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')



数据可视化 六边形 六边形数据图 excel_excel python 形状_07

End