精彩,Matplotlib 高级绘图永不过时!


精彩,Matplotlib 高级绘图永不过时!

仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接

在数据驱动决策的时代,有效可视化不仅是展示成果的手段,更是推动科学认知的关键桥梁。Matplotlib作为Python生态中最强大的可视化工具之一,能够将复杂数据转化为直观见解——无论是追踪全球疫情趋势的COVID-19热力图,还是揭示微观规律的散点矩阵。
本文中云朵君将以真实疫情数据为脉络,带您掌握从基础折线图到三维投影的完整可视化方法论,让你的数据不仅被看见,更能被理解、被记住。
我在这里使用的第一个图表是日历热图。这种类型的图表经常出现在医院仪表盘甚至咖啡馆的分析中。但将其用于科学数据对我来说是一个全新的挑战。
当我输入COVID-19的数据时,你可以清楚地看到病人数量随着时间的推移而增加。如果你有任何与日常趋势相关的数据集,这个图表就非常适合你的仪表盘。
说到我们是如何做到这一点的,Seaborn起到了关键作用。它提供了许多内置功能,如方形块、每周分组和颜色渐变。在典型的热图中,浅色表示正常水平,深红色反映严重程度。
如果查看Seaborn的官方文档,会发现有很多自定义选项,可以让热图更有意义。
研究人员可以考虑使用的另一种图表是Calmap时间序列图。虽然它通常用于显示生产力模式,但它在科学数据方面也有巨大潜力。
当我把COVID-19的数据输入其中,看看它的表现如何时,结果出人意料。折线上的条虚线清楚地表明了下一个转折点,COVID-19案例的个上升趋势精确地显示出来。
1. X轴(水平)——日期
显示从2020–12–01到2020–12–31的日期。
轴向右倾斜,以便更好地读取日期。
2. Y轴(垂直)——新病例
标记为“新病例”。
显示每日新增COVID-19病例数。
范围从1000到4500+。
残差图是最科学的图表之一,因为它揭示了其他图表通常无法揭示的问题–预测中的误差。
简单地说,它是实际值与预测值之间差异的图表:
残差=实际值−预测值
这有助于您了解模型在哪些方面表现良好,在哪些方面出现偏差,为提高准确性提供有价值的见解。
当虚线接近实际线时,说明你的预测是准确的–这表示为残差=0。
同理:
距离越小=预测越好
距离越大=误差越大
实际线以上的线表示病例预测不足
低于实际线表示对案例的预测过高。
最重要的是,所有这一切都要归功于Scikit-learn。
Scikit-learn是一个Python库,它是一个自学习模块,可以通过分析过去的趋势来预测未来的数值。例如,对于COVID-19数据,当我使用Scikit-learn时,它会分析10月和11月的趋势来预测12月的情况。通过残差图,我可以清楚地看到这些预测的准确性。
箭头图通常用于可视化矢量场——它使用箭头表示方向和幅度。虽然它在物理学或工程学中很常见,但我们在这里展示了它在数据分析中也能体现科学性和意义。
在我们的图中:
x轴表示新增COVID-19病例数
y轴表示2020年12月的天数
现在你可能会问——难道我们不能用系列图来实现这个效果吗?是的,可以。但这就是为什么在这种情况下使用箭头图更有意义:
这些尖锐的箭头代表每日变化率——病例数量的增加或减少速度。
这个关键细节是序列图无法清晰显示的。
虽然我们也介绍了序列图,但箭头图为我们提供了数据快速变化的更清晰的视觉提示。
我尝试用极坐标图来表示COVID-19数据,但说实话,不太合适。我意识到,极坐标图更适合周期性数据,例如风向或温度模式,而不是像每日COVID-19病例这样的线性时间序列数据,因为这些数据不遵循自然的循环或周期。
不过,我们还是试了一下,以下是我们观察到的结果。
这里所有的视觉效果都是用Matplotlib实现的,它非常适合绘制静态图。从调整颜色到图形大小,一切都是手动调整的。
其中一个挑战是在球形比例尺上绘制数值,这并不简单。但在NumPy的帮助下,我们解决了这个问题。
我们将天数转换为弧度,这至关重要,因为Matplotlib的极坐标绘图需要以弧度为单位的角度-而不是度数或日期。
我们必须将线性数据强制转换为循环形式,这并不自然地适合COVID-19趋势——但我们仍然尝试了一下。
以下是我们的映射方式:
0度代表2020年12月1日
360度代表2020年12月的最后一天
向外球形移动的虚线代表COVID-19病例数。
当线靠近边缘时,当天的病例数较高。
当线靠近外圈时,疫情越严重。
用波特图来表示COVID-19数据是一个疯狂而又创新的想法,因为它最初并非为这种可视化而设计的。波特图最常用于电气工程——用于分析系统中的频率、增益和相位。
但我发现了一个非常有趣的事实:我们能够突显传统COVID-19图表经常忽略的模式。通过转换到频域,幅度与频率视图有助于揭示数据中重复出现的趋势。
在此背景下:
Y轴表示幅度(模式的强度或密集程度)
X轴显示频率(模式出现的频率)
为了使问题更加简单明了,下面是我们使用博德图观察到的结果的快速细分:
在0. 1频率(10天周期):案例的震级为85dB,相当强。例如:
12月1日:1,120例-12月10日:2,100例-12月20日:3,120例。这显示出每10天重复一次的清晰而急剧的上升趋势。波特图以0. 1的频率捕捉到了这种模式,这代表每10天循环一次。
在0. 2频率(5天周期):振幅为75分贝,比10天周期稍弱。采样日:
12月5日→12月10日→12月15日这种模式确实存在,但不太明显。
在频率为0. 4(2-3天周期)时:未观察到任何有意义的模式。图表显示其震级较低,表明在如此短的时间间隔内没有真正的重复。
相图以展示不同阶段的数据以及在不同条件下发生的变化而闻名。它专为科学数据可视化而设计,常用于温度和压力分析等场景。
但当我将它应用于COVID-19数据时,结果却出奇地有效。
我们能够使用Pandas以及Matplotlib等静态图表工具来实现这一点。Matplotlib的绘图功能(在其官方网站上有详尽的文档)帮助我们清晰地可视化数据中的各个阶段。脚本的演示如下所示。
您可能注意到脚本中一个重要的部分是使用了ifcondition。这样做的原因很简单:定义哪些病例算作严重病例。例如,我们设置了3,500例这样的阈值。这种分类不仅增加了逻辑性,也增强了阶段图的表示。
3,500例这个数字也可能受到医院床位可用情况的影响。当病例数量超过医院容量时,许多患者可能仍无法进入医院系统,这正是我们选择这个门槛的原因。
我将其应用于COVID-19病例计数,将时间线分为三个不同的阶段:
低(少于2000例)
中(2000–3499例)
高(3500+例)
长按👇关注-数据STUDIO-设为星标,干货速递


文章作者: ZejunCao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ZejunCao !
  目录