为什么选择GIF地图?
在过去几年中,gif图表似乎已经在社交媒体上大受欢迎。像“金融时报”和“经济学人”这样的出版商花费了更多的时间来精简和完善他们的数据产品,以便于在Twitter和Instagram等平台上更好地展示信息。也许更重要的是,gif图表允许在静态图表显示的基础上创建一个新的数据维度。
Gif动图在数据可视化中的应用场景:
通过注释或突出显示来引导用户浏览同一图表中最重要的点
通过比较显示两个不同的图表
显示相同的图表随时间的变化(这是我们要做的)
该清单并非详尽无遗,用例也在不断扩大,可以说动态图表既炫酷又实用(正确使用时)。
下面让我们来开始制作。
如何制作一个gif动态地图
这是您应该开始的:
加载shapefile(地图文件)
加载要显示的csv数据文件
融合这两个类型的数据
绘制地图并设计样式
现在,我们将使用Python中for()循环的强大功能,将多个不同时期的数据展示在相同的地图上。因为我们想要显示随时间的变化,我们需要确保我们的数据包含年份作为变量。为便于标记,我们确保数据的每个列标题都是年份数字(即不同年的数据分别放在不同列)。
为了遍历每列的数据,我们需要一个字符串列表来调用每列的名称。让我们创建一个列表变量,其中包含每列的年份(格式化为字符串)。我们还设置一个输出路径,以便将每年的数据地图保存到一个文件夹中。
最后,在创建地图之前,我们要为vmin和max值设置一致的全局变量。这将设置颜色范围的值。如果你事先没有设置它,Matplotlib将在每次for循环迭代时改变等值区的范围,因此很难看出值随时间的增加或减少的方式。
写for循环
for()循环使用起来相当简单,for()循环中语法意思大概如下:
对于list_of_years列表中的每一年,运行以下代码。
当我们列表中的所有年份都通过代码时,停止循环。
如果您运行此代码并打开刚刚设置的输出路径文件夹,您应该会看到许多地图,每个地图的颜色略有不同,代表不同年份的数据。您可能会想:一旦做成地图动画,我们将如何知道年份的变化?
我们可以在底部设置一个简单的日期范围(2007-2015),但for()循环可以为我们提供更好的解决方案。由于我们已经将每列的年份保存为变量中的字符串,因此我们可以为每个地图添加不同的注释(对应于数据的年份)。
根据我们的for()循环,变量'year'将是每次for循环运行的列的年份。使用这个逻辑,我们可以插入'year'作为fig.annotate()参数的变量。
现在,每次for循环运行时,不同的年份将作为注释插入到地图上。使用相同的逻辑,我们也可以将文件名设置为每年开始,这样就很容易找到每年对应的地图。在for()循环中添加此代码将添加年份注释。
重新运行代码,您的地图会替换为新地图,每个地图的左下角都有年份注释。如果你从上到下翻阅地图,你就可以了解到你的gif会是什么样子。
制作GIF
我们在进行GIF制作之前,要将我们得到的所有png格式的地图图片,转化为jpg格式,图片格式转化有多种方法,下面举了一个在python中利用opencv(cv2)进行图片格式转化的例子,仅供参考。
接下来我们可以开始制作GIF动态地图了,有很多方法可以制作GIF动图,我们使用的是ImageMagick,原因有以下几点:
它相对容易安装和设置
它允许您在一行代码中设置转换时间,裁剪大小和文件格式
它超级快
ImageMagick的文档非常详尽。如果您尚未安装它,请查看其官方文档页面。
首先检查您是否正确安装了ImageMagick:
在命令行中输入并运行:
convert –version
如果已成功安装了ImageMagick,将显示包含版本和版权声明的消息。在系统上安装ImageMagick后,转到包含我们刚制作的所有地图的目录。现在我们需要运行一行代码来创建我们的gif。这行代码的作用如下:
convert:获取所有这些文件并进行更改
-delay 60:设置每个图像在进入下一个图像之间经过的时间
-loop 0:设置无限循环
插入将要转换的所有文件名
my_map.gif
这是在终端中使用的代码:
现在看看自动创建的新文件“new_map_normal.gif”,你看到的图像应该如下:
使用gif地图可以成为深入分析数据的一个很好的切入点。 此外,您可以将任何具有时间序列数据的图表转换为gif动图 - 我们这里只是选择了地图,因为它看起来更炫酷。
如果您有任何疑问,欢迎与我交流,后面会在评论区给出源码链接。