在数据科学和数据分析领域,数据的可视化是理解和传达信息的关键环节。而Matplotlib作为Python中最常用的可视化库之一,可以帮助你轻松创建精美的图表。无论是折线图、柱状图还是其他类型的图表,Matplotlib都能用简洁的代码实现,让数据的展示变得直观且富有表现力。
接下来我们通过11个Python Matplotlib实用图表的示例和详细的代码讲解,你将学会如何用Matplotlib生成各种图表,为你的数据分析增添视觉亮点。不论你是数据科学新手还是有经验的从业者,这些实用图表都将成为你工作中的得力助手。
1.简单折线图(Line Plot)
-
图形和坐标轴:在Matplotlib中,图形(figure)就像一个盒子,容纳了图表的所有部分。坐标轴(axes)则像是图形内的一个小盒子,周围有线条和说明图表含义的文字。
-
变量命名:图形对象通常命名为
fig
,坐标轴对象通常命名为
ax
。
-
绘制数据:使用
ax.plot
方法在坐标轴上绘制数据。
-
Pylab接口:提供类似于MATLAB的接口,自动创建图形和坐标轴。
-
多条折线:多次调用
plot
函数可以在同一图形上绘制多条折线。
import numpy as np
import matplotlib.pyplot as plt
plt.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 np
import matplotlib.pyplot as plt
plt.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 np
import matplotlib.pyplot as plt
plt.style.use('seaborn-v0_8-whitegrid')
x = np.linspace(0, 10, 50)
dy = 0.8
y = 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 np
import matplotlib.pyplot as plt
plt.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 np
import matplotlib.pyplot as plt
plt.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 np
import matplotlib.pyplot as plt
plt.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 np
import matplotlib.pyplot as plt
plt.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 np
import matplotlib.pyplot as plt
plt.style.use('seaborn-v0_8-whitegrid')
mean = [0, 0]
cov = [[1, 1], [1, 2]]
x, y = np.random.multivariate_normal(mean, cov, 3000).T
fig = 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 np
import matplotlib.pyplot as plt
import pandas as pd
import matplotlib.dates as mdates
plt.style.use('seaborn-v0_8-whitegrid')
dates = 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)
style = 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)
ax.set(title='USA births by day of year (1969-1988)',
ylabel='average daily births')
ax.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 np
import 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 np
import matplotlib.pyplot as plt
fig = 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')
ax.plot_trisurf(X.flatten(), Y.flatten(), Z.flatten(),
cmap='viridis', edgecolor='none')
plt.show()
上面通过11个实用示例,详细讲解如何用Matplotlib生成各种图表,包括折线图、散点图、错误可视化、密度图、直方图、自定义图例和颜色条、文本注释、自定义刻度以及3D图表。这些示例将帮助你提升数据展示的直观性和表现力,不论你是新手还是有经验的数据科学从业者,都能从中受益。