文章缩略图(作者提供的图片)
数据可视化比查看原始数字数据提供了更深刻的见解。
然而,创建吸引人的图表需要时间和精力。Matplotlib 是 Python 中数据可视化的事实标准库。它很简单,已经使用了几十年,而且你正在寻找的任何东西都可以通过一次网络搜索找到。
但事情并非总是那么美好。默认情况下,Matplotlib 可视化效果看起来很糟糕,作为一名数据专业人员,您必须进行许多调整才能获得可用的东西。今天这篇文章的目标就是让您达到这个目的。
最后,你将得到一个可以粘贴到任何 Jupyter Notebook 的代码片段。
Matplotlib 的默认样式有什么问题?
您无需下载任何数据集即可继续操作。您将创建一个具有增加趋势和可重复季节性模式的合成时间序列数据集:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Single season multiplier factors - for seasonality effect
seasonal_multipliers = [1.1, 1.3, 1.2, 1.5, 1.9, 2.3, 2.1, 2.8, 2.0, 1.7, 1.5, 1.2]
# Immitate 10 years of data
xs = np.arange(1, 121)
time_series = []
# Split to 10 chunks - 1 year each
for chunk in np.split(xs, 10):
for i, val in enumerate(chunk):
# Multiply value with seasonal scalar
time_series.append(float(val * seasonal_multipliers[i]))
x = pd.date_range(start="2015-01-01", freq="MS", periods=120)
y = time_series
print(x[-10:])
print(y[-10:])
图片 1 — 时间序列数据(作者提供)
由于dataset
具有日期作为索引,并且具有浮点值作为唯一属性,因此您可以直接通过以下方式绘制整个内容plt.plot()
:
plt.figure(figsize=(9, 6))
plt.plot(x, y)
plt.show()
图片 2 — 默认 matplotlib 图表(作者提供)
它的一切都彰显着 2002 年的风格。低分辨率。周围的框。字体大小。
没有什么是只需稍加调整就能解决的。
调整#1 - 调整 rcParams 以设置整体主题
手动调整每个图表肯定会浪费你的时间。
毕竟,您制作的大多数图表都会有一个底层主题。声明一次并在任何地方重复使用它是有意义的。这就是 的作用rcParams
。
以下代码片段更改了其中的一大堆内容,并确保您的图表呈现为 SVG。如果您明确将图表保存到磁盘,最后一点并不重要,但在笔记本环境中,它将产生巨大的差异:
import matplotlib_inline
matplotlib_inline.backend_inline.set_matplotlib_formats("svg")
plt.rcParams.update({
"figure.figsize": (9, 6),
"axes.spines.top": False,
"axes.spines.right": False,
"font.size": 14,
"figure.titlesize": "xx-large",
"xtick.labelsize": "medium",
"ytick.labelsize": "medium",
"axes.axisbelow": True
})
现在,当您重复调用时plt.plot()
,图表将看起来比较美观:
plt.plot(x, y)
plt.title("Sales Over Time")
plt.xlabel("Time Period")
plt.ylabel("Sales in 000")
plt.show()
图片 3 — 调整图表主题(图片来自作者)
还没有完全实现,但这个想法只是为了设置一个基本主题。您不应该在 中包含特定于图表的说明rcParams
。
调整 #2 — 将字体带入 21 世纪
您可以改变的另一件事rcParams
是字体。
你可以从互联网上下载任何 TTF 字体,然后通过 Matplotlib 加载它font_manager
。我将使用Roboto Condensed,但你可以随意选择你喜欢的任何字体:
import matplotlib.font_manager as font_manager
font_dir = ["/path/to/Roboto_Condensed"]
for font in font_manager.findSystemFonts(font_dir):
font_manager.fontManager.addfont(font)
plt.rcParams.update({
"font.family": "Roboto Condensed"
})
要验证字体是否已更改,只需重新运行之前的绘图片段:
plt.plot(x, y)
plt.title("Sales Over Time")
plt.xlabel("Time Period")
plt.ylabel("Sales in 000")
plt.show()
图片 4 — 更改字体(图片来自作者)
这就是我们要讨论的有关整体主题变化的全部内容。接下来,让我们具体讨论一下。
调整#3 — 针对您的图表类型进行微调
在进行微调时,不同的图表类型会有不同的采用方法。
对于折线图,您可以更改线条颜色和宽度,甚至可以添加填充区域部分以使图表看起来更像仪表板。
以下代码片段中所做的其他更改纯粹是外观上的——标题位置和 y 轴限制:
# 1. Line color and width
plt.plot(x, y, color="#1C3041", linewidth=2)
# 2. Add shaded area below the line
plt.fill_between(x, y, color="#1C3041", alpha=0.3)
# 3. Change title location and font weight
plt.title("Sales Over Time", loc="left", fontdict={"weight": "bold"}, y=1.06)
plt.xlabel("Time Period")
plt.ylabel("Sales in 000")
plt.show()
图片 5 — 最终图表(作者提供)
现在,这几乎是一个可以发布的可视化了!
一些具体的事情会产生很大的不同,但是如果没有打下坚实的基础,这是不可能的。
总结
许多数据专业人员完全忽视 Matplotlib,因为它的默认外观。
他们认为“这太模糊了,太糟糕了,我不能把这样的视觉效果发给我的老板。”事实与事实相差甚远。你可以更改一堆参数,最终得到一个可以随处携带的代码块——可以带到每个脚本、笔记本和环境中。
我鼓励您尝试各种参数来进一步个性化整体外观和感觉,并在下面的评论部分分享您的偏好。