专栏名称: 新语数据故事汇
《新语数据故事汇,数说新语》科普数据科学、讲述数据故事,深层次挖掘数据价值。
目录
相关文章推荐
51好读  ›  专栏  ›  新语数据故事汇

数据可视化基石:11个Matplotlib实用图表

新语数据故事汇  · 公众号  ·  · 2024-07-14 18:27

正文

请到「今天看啥」查看全文


在数据科学和数据分析领域,数据的可视化是理解和传达信息的关键环节。而Matplotlib作为Python中最常用的可视化库之一,可以帮助你轻松创建精美的图表。无论是折线图、柱状图还是其他类型的图表,Matplotlib都能用简洁的代码实现,让数据的展示变得直观且富有表现力。

接下来我们通过11个Python Matplotlib实用图表的示例和详细的代码讲解,你将学会如何用Matplotlib生成各种图表,为你的数据分析增添视觉亮点。不论你是数据科学新手还是有经验的从业者,这些实用图表都将成为你工作中的得力助手。

1.简单折线图(Line Plot)

  • 图形和坐标轴:在Matplotlib中,图形(figure)就像一个盒子,容纳了图表的所有部分。坐标轴(axes)则像是图形内的一个小盒子,周围有线条和说明图表含义的文字。

  • 变量命名:图形对象通常命名为 fig ,坐标轴对象通常命名为 ax

  • 绘制数据:使用 ax.plot 方法在坐标轴上绘制数据。

  • Pylab接口:提供类似于MATLAB的接口,自动创建图形和坐标轴。

  • 多条折线:多次调用 plot 函数可以在同一图形上绘制多条折线。

import numpy as npimport matplotlib.pyplot as pltplt.style.use('seaborn-v0_8-whitegrid')fig = plt.figure()ax = plt.axes()x = np.linspace(0, 10, 1000)plt.plot(x, np.sin(x))plt.plot(x, np.cos(x));plt.show()

2.简单的散点图(Scatter Plot)

  • 什么是散点图:散点图有一些不按顺序排列的点。折线图的点是连接在一起的。

  • 如何制作:你可以使用plt.plot或ax.plot来制作散点图。

  • 点的样式:你可以使用特定的代码改变点的外观。文档中有说明使用哪些代码。

  • plt.scatter的酷炫功能:你可以让每个点都与众不同。它们可以有不同的大小和颜色。你可以使用数据集来实现这一点。

  • 透明点:你可以通过alpha设置让点变得透明。当点重叠时,这个功能特别有用。

import numpy as npimport matplotlib.pyplot as pltplt.style.use('seaborn-v0_8-whitegrid')rng = np.random.RandomState(0)x = rng.randn(100)y = rng.randn(100)colors = rng.rand(100)sizes = 1000 * rng.rand(100)plt.scatter(x, y, c=colors, s=sizes, alpha=0.3,            cmap='viridis')plt.colorbar();plt.show()

3.错误可视化(Error Visualization)

  • 为什么重要:在科学中,准确处理误差与测量本身同样重要。

  • 举个例子:为了估算哈勃常数,你必须考虑误差。这有助于你判断不同测量结果是否一致。

  • 不确定性:当你报告一个测量值时,还要说明你的不确定程度(例如71±2.5 (km/s)/Mpc)。这让你更好地比较数据。

  • 显示误差:在图表中加入误差信息能提供更完整和正确的信息。

  • fmt设置:它控制图表中线条和点的外观,类似于plt.plot的代码。

  • errorbar函数:它让你改变误差条的外观,例如使它们变浅以便更容易看到。

  • 个性化设置:使用更多的errorbar设置可以实现水平误差条、单边误差条等。根据你的需求自定义图表。

import numpy as npimport matplotlib.pyplot as pltplt.style.use('seaborn-v0_8-whitegrid')x = np.linspace(0, 10, 50)dy = 0.8y = np.sin(x) + dy * np.random.randn(50)plt.errorbar(x, y, yerr=dy, fmt='o', color='black',             ecolor='lightgray', elinewidth=3, capsize=0);plt.show()

4.密度和等高线图(Density and Contour Plots)

  • 显示三维数据:在二维图表中展示三维数据,比如等高线图或热图。

  • 函数:使用plt.contour绘制等高线图,使用plt.contourf绘制填充等高线图,使用plt.imshow绘制图片。

  • 准备数据:使用np.meshgrid将一维数组转换为二维网格。

  • 绘制等高线图:plt.contour需要x、y和z数据用于网格和高度点。

  • 线条样式:在黑白等高线图中,虚线表示负值,实线表示正值。

  • 颜色图:使用cmap设置等高线的颜色,比如用RdGy显示集群数据。

  • 颜色键:使用plt.colorbar生成颜色键,显示颜色所对应的数值范围。

  • 填充等高线图:使用plt.contourf填充等高线图,使图表间隙更少,视觉效果更好。

import numpy as npimport matplotlib.pyplot as pltplt.style.use('seaborn-v0_8-whitegrid')def f(x, y):    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)x = np.linspace(0, 5, 50)y = np.linspace(0, 5, 40)X, Y = np.meshgrid(x, y)Z = f(X, Y)plt.contourf(X, Y, Z, 20, cmap='RdGy')plt.colorbar();plt.show()

5.直方图、分箱和密度(Histograms, Binning, and Density)

  • 基本直方图:使用Matplotlib的hist()函数快速绘制基本直方图。

  • 参数调整:hist()提供了多种参数来调整直方图的计算和显示。

  • 设置更改:不再使用normed参数。使用density参数来标准化数据。

  • 个性化:使用histtype='stepfilled'和alpha参数来绘制透明条形图。这有助于比较不同数据。

  • 查阅文档:查看plt.hist文档,了解更多调整方式。

  • 仅获取数据:如果只需要直方图数据而不需要绘图,可以使用np.histogram()。

import numpy as npimport matplotlib.pyplot as pltplt.style.use('seaborn-v0_8-whitegrid')x1 = np.random.normal(0, 0.8, 1000)x2 = np.random.normal(-2, 1, 1000)x3 = np.random.normal(3, 2, 1000)kwargs = dict(histtype='stepfilled', alpha=0.3, density=True, bins=40)plt.hist(x1, **kwargs)plt.hist(x2, **kwargs)plt.hist(x3, **kwargs);plt.show()

6.自定义图例(Custom Legends)

  • 重要性:图例为可视化增加了意义,澄清了图表的不同元素。

  • 创建图例:使用plt.legend()为图表部分添加名称和图例。

  • 自定义:选择图例的位置。去掉边框。使用多行显示。使边角圆滑或添加阴影。改变透明度和文字间距。

  • 选择显示内容:指定哪些部分和名称显示在图例中。通过设置plot返回的内容来实现。

  • 多条线条:plt.plot可以返回多条线条。选择要传递给plt.legend()的线条,以创建你需要的图例。

  • 命名部分:在图表部分直接添加名称,然后将它们放入图例中,这样可以更容易看清每个部分的含义。

import




    
 numpy as npimport matplotlib.pyplot as pltplt.style.use('seaborn-v0_8-whitegrid')x = np.linspace(0, 10, 1000)y = np.sin(x[:, np.newaxis] + np.pi * np.arange(0, 2, 0.5))
plt.plot(x, y[:, 0], label='first')plt.plot(x, y[:, 1], label='second')plt.plot(x, y[:, 2:])plt.legend(framealpha=1, frameon=True);plt.show()

7.自定义颜色条(Custom Colorbars)

  • 图例与颜色条:图例标记离散标签,而颜色条表示连续的值与颜色之间的关系。

  • 创建颜色条:使用plt.colorbar()创建颜色条。

  • 颜色图:使用cmap参数指定颜色图。

  • 颜色图资源:所有可用的颜色图都在plt.cm模块中,可以使用IPython的Tab自动补全列出颜色图。

  • 颜色图类型:

    • 连续颜色图:单一连续的颜色系列,如binary或viridis。

    • 分叉颜色图:两个对比色系列,如RdBu或PuOr。

    • 定性颜色图:不连续的颜色组合,如rainbow或jet。

import numpy as npimport matplotlib.pyplot as pltplt.style.use('classic')x = np.linspace(0, 10, 1000)I = np.sin(x) * np.cos(x[:, np.newaxis])plt.imshow(I, aspect='auto', cmap='viridis')plt.colorbar()plt.show()

8.多子图(Multiple Subplots)

  • 概念:Matplotlib允许在单个图中显示多个子图,以便并排展示数据。

  • 创建子图:使用plt.axes()创建子图,可以通过列表参数[left, bottom, width, height]指定位置和大小。

  • 默认行为:plt.axes()默认创建填满整个图形区域的坐标轴对象。

  • 对齐:使用plt.subplot()在网格中创建子图,可以指定行数、列数和子图索引的参数。

  • 多行/列:使用plt.GridSpec()创建跨多行或多列的子图,定义网格布局。

  • GridSpec用法:plt.GridSpec()定义网格布局,并可传递给plt.subplot()用于创建子图。

  • GridSpec特点:它不直接创建图表,而是定义子图的网格布局。

import numpy as npimport matplotlib.pyplot as pltplt.style.use('seaborn-v0_8-whitegrid')mean = [0, 0]cov = [[1, 1], [1, 2]]x, y = np.random.multivariate_normal(mean, cov, 3000).Tfig = plt.figure(figsize=(6, 6))grid = plt.GridSpec(4, 4, hspace=0.2, wspace=0.2)main_ax = fig.add_subplot(grid[:-1, 1:])y_hist = fig.add_subplot(grid[:-1, 0], xticklabels=[], sharey=main_ax)x_hist = fig.add_subplot(grid[-1, 1:], yticklabels=[], sharex=main_ax)main_ax.plot(x, y, 'ok', markersize=3, alpha=0.2)x_hist.hist(x, 40, histtype='stepfilled',            orientation='vertical', color='gray')x_hist.invert_yaxis() y_hist.hist(y, 40, histtype='stepfilled',            orientation='horizontal', color='gray')y_hist.invert_xaxis() plt.show()

9.文本和注释(Text and Annotations)

  • 目的:可视化旨在向读者传达数据背后的故事。

  • 表达方式:有些图表本身就能讲述故事,而有些则需要文字辅助。

  • 注释:在图表中添加文本注释可以吸引读者注意力并帮助理解。

  • 文本放置:使用plt.text或ax.text在图表的特定位置(x,y)添加文本。

  • 指导:通过文本注释引导读者关注关键的图表特征,以增强信息传递效果。

import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport matplotlib.dates as mdatesplt.style.use('seaborn-v0_8-whitegrid')# Create sample datasetdates = pd.date_range(start='1969-01-01', end='1988-12-31', freq='D')data = np.random.randint(3000, 5000, size=len(dates))births = pd.DataFrame(data, columns=['births'], index=dates)fig, ax = plt.subplots(figsize=(12, 4))births_by_date = births.pivot_table('births', [births.index.month, births.index.day])births_by_date.index = [pd.Timestamp(year=2012, month=month, day=day) for month, day in births_by_date.index]births_by_date.plot(ax=ax)# Annotate specific positions on the line plotstyle = dict(size=10, color='gray')ax.text(pd.Timestamp('2012-1-1'), 3950, "New Year's Day", **style)ax.text(pd.Timestamp('2012-7-4'), 4250, "Independence Day", ha='center', **style)ax.text(pd.Timestamp('2012-9-4'), 4850, "Labor Day", ha='center', **style)ax.text(pd.Timestamp('2012-10-31'), 4600, "Halloween", ha='right', **style)ax.text(pd.Timestamp('2012-11-25'), 4450, "Thanksgiving", ha='center', **style)ax.text(pd.Timestamp('2012-12-25'), 3850, "Christmas", ha='right', **style)# Set title and y-axis labelax.set(title='USA births by day of year (1969-1988)',       ylabel='average daily births')# Center month labels on the x-axisax.xaxis.set_major_locator(mdates.MonthLocator())ax.xaxis.set_minor_locator(mdates.MonthLocator(bymonthday=15))ax.xaxis.set_major_formatter(plt.NullFormatter())ax.xaxis.set_minor_formatter(mdates.DateFormatter('%b'))plt.show()

10.自定义刻度(Custom Ticks)

  • 修改刻度:Matplotlib默认的刻度对大多数图表来说都很好用。但对于某些图表,你可能需要进行修改。

  • 组成部分:Matplotlib中的所有图表部分都是事物。图形(Figure)包含坐标轴(Axes)。坐标轴包含图表的各种内容。

  • 坐标轴内容:坐标轴有xaxis和yaxis。它们包括线条、刻度、名称等。

import numpy as npimport matplotlib.pyplot as plt
plt.style.use('seaborn-v0_8-whitegrid')fig, ax = plt.subplots()x = np.linspace(0, 3 * np.pi, 1000)ax.plot(x, np.sin(x), lw=3, label='Sine')ax.plot(x, np.cos(x), lw=3, label='Cosine')ax.grid(True)ax.legend(frameon=False)ax.axis('equal')ax.set_xlim(0, 3 * np.pi);plt.show()

11.创建Matplotlib中的3D图表(Creating 3D Plots in Matplotlib)

  • 从2D到3D:Matplotlib最初仅支持2D图表;3D绘图工具是在版本1.0中引入的。

  • 3D工具包:通过加载mplot3d工具包,Matplotlib支持3D绘图。

  • 3D图表类型:激活3D坐标轴后,可以绘制各种3D图表,如线图和散点图。

  • 3D绘图函数:使用ax.plot3D和ax.scatter3D分别绘制3D线图和散点图。

  • 透明度和深度:散点图具有不同的透明度来表示深度。

  • 交互视图:交互视图提供更好的3D视觉体验。

  • 3D凸起图:mplot3d工具包具有制作3D凸起图的工具。它们类似于2D的ax.contour图。

  • 3D表面图:表面图使用颜色填充形状以展示3D表面,看起来比线框图更好。

  • 网格数据图片:从网格数据生成的3D图片包括线框图和表面图。它们将数据展示在3D形状上,使其更加清晰和具有说服力。

  • 修改刻度样式:正常的刻度样式对大多数情况都适用。但对于某些图表,如正弦和余弦图表,你可能需要修改它们。

  • 自定义示例:修改刻度的位置和外观有助于展示图表的含义。你可以根据数据调整刻度,使之更加合适。

import numpy as npimport matplotlib.pyplot as pltfig = plt.figure()ax = plt.axes(projection='3d')def f(x, y):    return np.sin(np.sqrt(x ** 2 + y ** 2))x = np.linspace(-6, 6, 30)y = np.linspace(-6, 6, 30)X, Y = np.meshgrid(x, y)Z = f(X, Y)ax.set_xlabel('x')ax.set_ylabel('y')ax.set_zlabel('z')# Flatten the X, Y, Z arrays for plot_trisurfax.plot_trisurf(X.flatten(), Y.flatten(), Z.flatten(),                cmap='viridis', edgecolor='none')plt.show()


上面通过11个实用示例,详细讲解如何用Matplotlib生成各种图表,包括折线图、散点图、错误可视化、密度图、直方图、自定义图例和颜色条、文本注释、自定义刻度以及3D图表。这些示例将帮助你提升数据展示的直观性和表现力,不论你是新手还是有经验的数据科学从业者,都能从中受益。







请到「今天看啥」查看全文