Press "Enter" to skip to content

Matplotlib技巧:根据“Storytelling with Data”立即提高数据可视化水平

使用Matplotlib在Python中重新学习Cole Nussbaumer Knaflic的书中的教训

Matplotlib技巧:根据“Storytelling with Data”立即提高数据可视化水平 数据科学 第1张

能够有效地使用数据进行沟通是任何涉及数据的人都需要掌握的技能——不仅仅是数据科学家和数据分析师。

我最喜欢的关于这个话题的书籍之一是Cole Nussbaumer Knaflic的《Storytelling with Data》。它充满了实用的例子,教你如何改进数据可视化。

数据故事:商业专业人士的数据可视化指南

数据故事:商业专业人士的数据可视化指南[Nussbaumer Knaflic, Cole]在Amazon.com上…

www.amazon.com

我认为这本书唯一令人遗憾的地方是它的例子是使用Microsoft Excel创建的。

如果你认识一个喜欢在Excel中创建数据可视化的工程师,请举手——是的,我也不认识。

“你可能是一名工程师,但你的图表不应该需要一个拥有工程学位的人才能理解。”——Cole Nussbaumer Knaflic在“Storytelling with Data”中

这就是为什么本文将涵盖我自从阅读Nussbaumer Knaflic的《Storytelling with Data》以来使用最多的Matplotlib代码片段。

import matplotlib.pyplot as plt

本文假定你已经知道如何使用Matplotlib和Seaborn进行数据可视化的基础知识,例如创建条形图、折线图或散点图、修改颜色调色板以及添加基本标签。本文还假定你知道在何时使用哪种类型的图表。

本文不会讲解Matplotlib的基础知识,而是集中讲解 less commonly known 的技巧,例如:

  • 如何删除Matplotlib图的顶部和右侧边框
  • 如何删除Matplotlib图的刻度
  • 如何自定义Matplotlib图中单个条形的颜色
  • 如何更改Matplotlib图中x轴和y轴的颜色
  • 如何在Matplotlib图中添加文本注释
  • 如何在Matplotlib图中为条形图添加值
  • 如何使Matplotlib注释中的整个或部分文本加粗
  • 如何在Matplotlib注释中着色文本

让我们从一个简单的例子开始。以下数据是虚构的,以便让我们专注于数据可视化技术:

import pandas as pd# 定义虚构示例数据框df = pd.DataFrame(          {'feature 1' : ['cat 1', 'cat 2', 'cat 3', 'cat 4'],           'feature 2' : [400, 300, 200, 100]          })

让我们使用Seaborn创建一个简单的单色条形图,作为起点,并添加一个标题:

import seaborn as sns# 从示例数据框创建一个基本的条形图fig, ax = plt.subplots(1,1, figsize = (6, 4))sns.barplot(data =  df,             x = 'feature 1',             y = 'feature 2',             color = 'tan')# 添加标题ax.set_title('有意义的标题')plt.show()

Matplotlib技巧:根据“Storytelling with Data”立即提高数据可视化水平 数据科学 第2张

删除杂乱无序的东西

在“杂乱无序的东西是你的敌人!”章节中,Nussbaumer Knaflic讲述了如何识别和消除数据可视化中的杂乱无序的东西——本节将向您展示如何在Matplotlib图中删除视觉杂乱。

“[…]每个单独的元素都会增加你的观众的认知负荷。”——Cole Nussbaumer Knaflic在“Storytelling with Data”中

如何删除Matplotlib图绘制中的顶部和右侧边框

默认情况下,Matplotlib图绘制时会在图形边缘周围有一个所谓的“脊柱”框。特别是顶部和右侧的“脊柱”可能会干扰数据可视化,因此应该将其删除。

您可以使用以下代码片段简单地删除不相关的“脊柱”:

# 删除顶部和右侧的“脊柱”ax.spines['right'].set_visible(False)ax.spines['top'].set_visible(False)

如果您想要删除其他“脊柱”,可以使用'bottom''left'。如果您想要删除边框,包括完整的x和y轴,可以使用ax.axis('off')

如何从Matplotlib图中删除刻度线

刻度线通常不被认为是干扰。但在某些情况下,例如在此示例中,柱状图的x轴刻度线是多余的。

# 删除x轴上的刻度线ax.tick_params(bottom = False)

如果您想要删除y轴的刻度线,可以使用left = False

现在,删除了杂乱无用的部分,示例看起来像下面这样:

在Matplotlib图中删除杂乱无用部分前后对比

新绘制的图是否使您感觉更加平静,因为消除了视觉杂乱?

弱化

在“像设计师一样思考”一章中,Nussbaumer Knaflic向我们展示了如何淡化必要但相关的信息。本节将向您展示如何更改Matplotlib图中不重要部分的颜色。

“将必要但不影响信息传达的项目推到背景中。[…]浅灰色适用于此。” —— Cole Nussbaumer Knaflic 的《Storytelling with Data》

如何自定义Matplotlib图中各个条形的颜色

sns.barplot方法的color参数替换为palette参数,以控制每个条形的颜色。通过这样做,您可以使用浅灰色来弱化不重要的条形,只突出显示主要颜色的相关条形。

# 定义各个条形的颜色custom_colors = ['lightgrey', 'tan', 'lightgrey', 'lightgrey']# 弱化不重要的条形sns.barplot(data =  df,             x = 'feature 1',             y = 'feature 2',             palette = custom_colors) 

如何更改Matplotlib图中x轴和y轴的颜色

接下来,我们还想将x轴和y轴的颜色变浅。为此,我们需要将轴的脊柱、刻度线和标签的颜色变浅:

# 将脊柱颜色变浅ax.spines['left'].set_color('grey')   ax.spines['bottom'].set_color('grey')# 将刻度线颜色变浅ax.tick_params(colors = 'grey')# 将标签颜色变浅ax.set_xlabel('feature 1', color = 'grey')ax.set_ylabel('feature 2', color = 'grey')

现在,弱化不重要信息的示例看起来像下面这样:

在Matplotlib图中弱化不重要信息前后对比

文本是您的好朋友:添加注释

Nussbaumer Knaflic强调,应该在数据可视化中添加文本以凸显关键要点。在本节中,我们将介绍ax.annotate()方法来在Matplotlib绘图中添加文本。

“如果您希望您的听众得出结论,请用文字表达。” – Cole Nussbaumer Knaflic在“Storytelling with Data”中

如何在Matplotlib绘图中添加文本注释

要在Matplotlib图中添加文本,您可以使用ax.annotate()方法,该方法将文本和其在图中的位置作为参数。此外,您可以指定水平(ha)或垂直对齐(va)或字体大小等方面。

# 添加文本注释ax.annotate('Look at "cat 2". \nThis is important!',             xy = (1.5, 360),               ha = 'center',              fontsize = 11,           )

如果您想要有一个额外的箭头指向某个东西,您需要使用以下参数:

  • xy:要注释的点——即您的箭头将指向的地方
  • xytext:文本的放置位置(箭头的终点)
  • arrowprops={'arrowstyle':'->'}:箭头应该是什么样子

如何在Matplotlib绘图中添加条形图的值

要向每个单独的条形图添加值,我们需要遍历ax.patches。对于每个bar,您可以使用get_height()get_width()get_x()方法来将值放在条形图上方。

# 用值注释条形图for bar in ax.patches:    ax.annotate(int(bar.get_height()),                xy = (bar.get_x() + bar.get_width() / 2, bar.get_height()),                 ha = 'center',                 va = 'center',                xytext = (0, 8),                textcoords = 'offset points'                )

现在,添加了文本注释的示例如下:

在Matplotlib绘图中添加文本注释之前和之后的情况。

强调

在章节“聚焦您的听众的注意力”中,Nussbaumer Knaflic谈到了如何利用注意先行属性来引导您的听众关注您想要他们看到的内容。在本节中,我们将讨论一些简单的调整,您可以应用于Matplotlib图中的文本注释,以利用文本中的注意先行属性。

“[…]如果我们有策略地使用注意先行属性,它们可以帮助我们使我们的听众在他们甚至不知道他们正在看到它之前就看到我们希望他们看到的东西。” – Cole Nussbaumer Knaflic在“Storytelling with Data”中

如何在Matplotlib注释中使整个或部分文本加粗

使用粗体文本可以帮助突出显示数据可视化中的重要部分。如果您只想突出显示注释的一部分,可以在字符串中使用$\\bf{}$并将要强调的文本放在花括号中。如果您想强调整个注释,只需添加参数fontweight='bold'

# 使文本的一部分变粗ax.annotate('Look at "cat 2". \nThis is $\\bf{important}$!',             #...           )# 使所有文本都变粗ax.annotate('Look at "cat 2". \nThis is important!',             #...            fontweight='bold',           )

如何在Matplotlib注释中给文本着色

为了将特定的文本与数据可视化中的特定元素相关联,可以利用相同的颜色来进行关联。要给文本注释颜色,只需将参数color添加到ax.annotate()方法中。

# 删除x轴上的刻度ax.tick_params(bottom = False)# 将重要的信息添加到绘图中ax.annotate('看“cat 2”。\n这是$\\bf{important}$!', # 强调重要的术语            xy = (1.5, 360),             ha = 'center',            color = 'tan',             fontsize = 11,           )

现在,强调重要信息的示例如下:

在Matplotlib绘图中强调重要信息之前和之后的情况。

总结

下面您可以看到这些小的Matplotlib技巧对数据可视化产生的差异。通过简单地去除杂乱,添加文本注释,并减弱不重要的信息,而不是强调重要的信息,您可以立即看到示例数据可视化的可读性上的强烈差异。

在Matplotlib绘图中应用重要信息之前和之后的情况。

下面您可以看到创建最终数据可视化的代码。

import matplotlib.pyplot as pltimport seaborn as sns# 定义颜色调色板highlight_color = 'tan'muted_color = 'dimgrey'muted_color2 = 'lightgrey'custom_colors = [muted_color2, 'tan', muted_color2, muted_color2]# 从示例数据框中创建基本的条形图fig, ax = plt.subplots(1,1, figsize = (6, 4))sns.barplot(data =  df,             x = 'feature 1',             y = 'feature 2',             palette = custom_colors) # 减弱不重要的条形图# 添加标题ax.set_title('有意义的标题')# 减弱标签颜色ax.set_xlabel('feature 1', color = muted_color)ax.set_ylabel('feature 2', color = muted_color)# 移除不重要的脊柱并减弱剩余脊柱的颜色ax.spines['right'].set_visible(False)      # 移除顶部和右侧的脊柱ax.spines['top'].set_visible(False)        # 移除顶部和右侧的脊柱ax.spines['left'].set_color(muted_color)   # 减弱脊柱的颜色ax.spines['bottom'].set_color(muted_color) # 减弱脊柱的颜色# 移除x轴上的刻度并减弱刻度的颜色ax.tick_params(bottom = False,        # 移除x轴上的刻度    colors = muted_color,             # 减弱刻度的颜色)# 使用值注释条形图for i, bar in enumerate(ax.patches):    ax.annotate(int(bar.get_height()),    xy = (bar.get_x() + bar.get_width() / 2, bar.get_height()),     ha = 'center',     va = 'center',    xytext = (0, 8),    textcoords = 'offset points',    color = custom_colors[i])# 将重要的信息添加到绘图中ax.annotate('看“cat 2”。\n这是$\\bf{important}$!', # 强调重要的术语            xy = (1.5, 360),             ha = 'center',            color = highlight_color,             fontsize = 11,           )     plt.show()

Cole Nussbaumer Knaflic的“Storytelling with Data”是我最喜欢的数据可视化书籍之一。如果您对如何将数据可视化提升到下一个级别感兴趣,我绝对推荐这本书。

如果您对更多的Matplotlib技巧感兴趣,在此存储库中,Andre Gaskov使用Matplotlib在Python中重新创建了书中的许多可视化:

GitHub – empathy87/storytelling-with-data: Plots from the book “Storytelling with data”…

使用Python和matplotlib实现《数据叙事》一书中的图 – GitHub …

github.com

喜欢这个故事吗?

免费订阅以获得新故事发布通知。

想阅读超过三个免费故事吗? — 成为小猪AI会员,每月只需5美元。您可以在注册时使用我的推荐链接支持我,我将不会额外收取任何费用。

作为小猪AI会员,您的会员费的一部分将用于支持您所阅读的作家,并且您将获得完整的访问权限…

小猪AI.com

在 LinkedIn、Twitter 和 Kaggle 上找到我!

参考资料

图片来源

除非另有说明,否则所有图片均由作者创建。

网络与文献

Knaflic, Cole. 《数据叙事:商业专业人士的数据可视化指南》, Wiley, © 2015。

Leave a Reply

Your email address will not be published. Required fields are marked *