数据可视化|用热力地图进行数据分析
01
你好,我是林骥。
热力地图是根据指标数据的大小,对各地区按比例填充颜色,用颜色的深浅代表数值的大小。由于展现的数据与地理位置相关,所以让信息沟通变得更加直观形象,也更具专业的品质。
传统的数据地图,地理区域的面积大小严重失衡,但是这又与展示的数据大小无关,造成面积小的区域在地图上可能难以识别。比如说,北京和上海,在地图上常常看不清楚。
为了统一各区域的大小,同时体现相对的地理位置,我们使用正六边形来代替地图上的区域。
比如说,为了展现各省 2019 年的 GDP 数据,我们可以制作一个如下的热力地图:
从上面的热力地图可以直观地看出,广东和江苏的 GDP 明显高于其他地区。
02
你可以前往 https://github.com/linjiwx/mp 下载画图用的数据和完整代码。
下面是作图的过程。
首先,导入所需的库,并设置中文字体和定义颜色等。
# 导入所需的库 import pandas as pd import numpy as np from plotnine import * from pylab import 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') gdp = pd.read_excel('./data/各省2019年GDP数据.xlsx') # 计算每个省份的中心坐标 df_center = df.groupby('Province').mean() # 合并省份坐标和数据 dfxy = pd.merge(df_center, gdp, on='Province', how ='left') # 定义颜色数值 color_value = np.array(dfxy.GDP)
接下来,开始用「面向对象」的方法进行画图。
# 使用「面向对象」的方法画图,定义图片的大小 fig, ax = plt.subplots(figsize=(16, 9)) # 设置背景颜色 fig.set_facecolor('w') ax.set_facecolor('w') # 设置标题 ax.set_title('\n各省 2019 年的 GDP 数据', loc='center', fontsize=26) # 循环设置每个省份 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=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()
03
被誉为「摩天大楼之父」的美国著名建筑设计师路易斯·沙利文曾经说过一句名言:
形式永远服从于功能。
这句话用在数据可视化领域非常恰当,数据可视化是为了让数据更容易被读者理解,而不是为了炫耀。我们所使用的每一种视觉效果,都应该有其明确的、有价值的作用。
试想一下,如果我们的数据可视化作品,并没有提高易读性,而仅是为了美观或是为了炫耀自己使用软件的能力,那么同时使用多种效果只会加大读者阅读的难度。
无论你是否花费了大量的努力来精心制作,只要没人能理解你想表达的内容,你的数据可视化作品就是失败的,而你就应该有责任去解决这个问题。
THE END
0
二维码
海报
数据可视化|用热力地图进行数据分析
01
你好,我是林骥。
热力地图是根据指标数据的大小,对各地区按比例填充颜色,用颜色的深浅代表数值的大小。由于展现的数据与地理位置相关,所以让信息沟通……