最近阅读学习了林骥老师的《数据化分析 Python 实战》,书中讲好的技能应该刻意的练习,而不是简单的重复。
学习林骥老师的数据可视化的每种图表时,原来代码略微修改,使其适用于自己工作业务中的数据可视化。
林骥老师将数据可视化分析源代码分享在他的GitHub空间https://github.com/linjiwx/mp
热力地图是根据指标数据的大小,对各地区按比例填充颜色,用颜色的深浅代表数值的大小。由于展现的数据与地理位置相关,所以让信息沟通变得更加直观形象,也更具专业的品质。
传统的数据地图,地理区域的面积大小严重失衡,但是这又与展示的数据大小无关,造成面积小的区域在地图上可能难以识别。比如说,北京和上海,在地图上常常看不清楚。
为了统一各区域的大小,同时体现相对的地理位置,我们使用正六边形来代替地图上的区域。(引用林老师原文)
数据如下:
代码语言:text复制城市 AQI
郑州 103.47
洛阳 95.86
安阳 110.99
开封 103.24
焦作 103.46
平顶山 97.45
信阳 82.19
周口 96.86
鹤壁 91.68
新乡 95.48
濮阳 98.85
许昌 101.87
漯河 98.4
南阳 92.36
商丘 97.48
驻马店 92.66
三门峡 96.57
六边型坐标如下:
代码语言:text复制City x y
濮阳 0.774736842 0.782363977
濮阳 0.846315789 0.750469043
濮阳 0.844210526 0.671669794
濮阳 0.774736842 0.643527205
濮阳 0.705263158 0.673545966
濮阳 0.705263158 0.750469043
濮阳 0.774736842 0.782363977
安阳 0.635789474 0.780487805
安阳 0.705263158 0.750469043
安阳 0.705263158 0.673545966
安阳 0.633684211 0.641651032
安阳 0.564210526 0.671669794
安阳 0.564210526 0.748592871
安阳 0.635789474 0.780487805
鹤壁 0.496842105 0.778611632
鹤壁 0.564210526 0.748592871
鹤壁 0.564210526 0.671669794
鹤壁 0.496842105 0.641651032
鹤壁 0.425263158 0.673545966
鹤壁 0.425263158 0.746716698
鹤壁 0.496842105 0.778611632
新乡 0.564210526 0.671669794
新乡 0.633684211 0.641651032
新乡 0.635789474 0.564727955
新乡 0.566315789 0.532833021
新乡 0.494736842 0.564727955
新乡 0.496842105 0.641651032
新乡 0.564210526 0.671669794
焦作 0.425263158 0.673545966
焦作 0.496842105 0.641651032
焦作 0.494736842 0.564727955
焦作 0.427368421 0.534709193
焦作 0.357894737 0.564727955
焦作 0.357894737 0.643527205
焦作 0.427368421 0.673545966
商丘 0.774736842 0.564727955
商丘 0.844210526 0.532833021
商丘 0.844210526 0.455909944
商丘 0.774736842 0.427767355
商丘 0.705263158 0.459662289
商丘 0.705263158 0.532833021
商丘 0.774736842 0.564727955
开封 0.635789474 0.564727955
开封 0.705263158 0.532833021
开封 0.705263158 0.459662289
开封 0.633684211 0.427767355
开封 0.564210526 0.455909944
开封 0.566315789 0.532833021
开封 0.635789474 0.564727955
郑州 0.494736842 0.564727955
郑州 0.566315789 0.532833021
郑州 0.566315789 0.455909944
郑州 0.494736842 0.425891182
郑州 0.429473684 0.455909944
郑州 0.429473684 0.534709193
郑州 0.494736842 0.564727955
洛阳 0.357894737 0.564727955
洛阳 0.427368421 0.534709193
洛阳 0.429473684 0.455909944
洛阳 0.357894737 0.424015009
洛阳 0.288421053 0.454033771
洛阳 0.288421053 0.532833021
洛阳 0.357894737 0.564727955
三门峡 0.218947368 0.564727955
三门峡 0.288421053 0.532833021
三门峡 0.288421053 0.454033771
三门峡 0.221052632 0.424015009
三门峡 0.151578947 0.454033771
三门峡 0.151578947 0.532833021
三门峡 0.218947368 0.564727955
周口 0.705263158 0.459662289
周口 0.774736842 0.427767355
周口 0.774736842 0.348968105
周口 0.707368421 0.317073171
周口 0.635789474 0.348968105
周口 0.633684211 0.427767355
周口 0.705263158 0.459662289
许昌 0.564210526 0.455909944
许昌 0.633684211 0.427767355
许昌 0.635789474 0.348968105
许昌 0.570526316 0.317073171
许昌 0.496842105 0.347091932
许昌 0.496842105 0.425891182
许昌 0.564210526 0.455909944
平顶山 0.429473684 0.455909944
平顶山 0.496842105 0.425891182
平顶山 0.496842105 0.347091932
平顶山 0.429473684 0.315196998
平顶山 0.357894737 0.34521576
平顶山 0.357894737 0.424015009
平顶山 0.429473684 0.455909944
漯河 0.494736842 0.348968105
漯河 0.566315789 0.317073171
漯河 0.566315789 0.240150094
漯河 0.494736842 0.210131332
漯河 0.429473684 0.240150094
漯河 0.429473684 0.318949343
漯河 0.494736842 0.348968105
南阳 0.357894737 0.348968105
南阳 0.427368421 0.318949343
南阳 0.429473684 0.240150094
南阳 0.357894737 0.208255159
南阳 0.288421053 0.238273921
南阳 0.288421053 0.317073171
南阳 0.357894737 0.348968105
驻马店 0.429473684 0.240150094
驻马店 0.496842105 0.210131332
驻马店 0.496842105 0.131332083
驻马店 0.429473684 0.099437148
驻马店 0.357894737 0.12945591
驻马店 0.357894737 0.208255159
驻马店 0.429473684 0.240150094
信阳 0.357894737 0.133208255
信阳 0.427368421 0.103189493
信阳 0.429473684 0.024390244
信阳 0.357894737 -0.00750469
信阳 0.288421053 0.022514071
信阳 0.288421053 0.101313321
信阳 0.357894737 0.133208255
代码如下:
代码语言:javascript复制# 导入所需的库
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes
from matplotlib.collections import PatchCollection
from matplotlib import cm, colors
# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 禁用科学计数法
pd.set_option('display.float_format', lambda x: '%.2f' % x)
# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
'灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
'橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}
# 从 Excel 文件中读取数据
df = pd.read_excel('./data/各城市坐标.xlsx',0)
aqi= pd.read_excel('./data/AQI.xlsx',0)
# 计算每个省份的中心坐标
df_center = df.groupby('City').mean()
# 合并省份坐标和数据
dfxy = pd.merge(df_center, aqi, left_index=True,right_on='城市', how ='left')
dfxy=dfxy.rename(columns={'城市':'City'})
# 定义颜色数值
color_value = np.array(dfxy.AQI)
# 使用「面向对象」的方法画图,定义图片的大小
fig, ax = plt.subplots(figsize=(9, 9))
# 设置背景颜色
fig.set_facecolor('w')
ax.set_facecolor('w')
# 设置标题
ax.set_title('n2018年河南省各地市AQI', loc='center', fontsize=26)
# 循环设置每个省份
patches = []
for City in np.unique(df['City']):
# 筛选每个城市的数据
dfp = df[df['City'] == City]
# 多边形的每个位置
rect = mpathes.Polygon([(x, y) for x, y in zip(dfp['x'], dfp['y'])])
patches.append(rect)
# 多边形内部显示城市名称和数据
ax.text(df_center.loc[City].x, df_center.loc[City].y,
'n' City 'n' '%.2f' % dfxy[dfxy['City'] == City].AQI.values[0],
fontsize=15, va='center', ha='center', color=c['深灰色'])
# 填充形状和颜色
collection = PatchCollection(patches, alpha=0.5, cmap=plt.cm.Oranges, ec=c['浅灰色'], 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.show()