Python Data Visualization with Matplotlib — Part 1

原文:HTML
原题:Python Data Visualization with Matplotlib — Part 1——Completed Matplotlib tutorials for Python plotting from basic to advanced, with 100+ examples
作者:Rizky Maulana Nurhidayat
翻译:datamonday


文章目录


数据可视化的目的是将数据以更直接的方式表现出来,如散点图、密度图、柱状图等。它还有助于让读者或分析师了解其数据的全局情况。通过对数据的可视化,你可以发现潜在的异常值。在Python中,你可以使用各种模块或库来可视化数据。其中一个主流模块是Matplotlib。你可以使用Matplotlib以各种绘图风格来可视化数据。但是,Matplotlib不能向你展示动态图。如果你想创建一个巨大的动态图,你可以使用plotly的Dash(我希望下个月能完成一个关于Dash的完整教程的故事)。

这个故事将指导你如何用Matplotlib以各种方式可视化数据。90个例子也许可以启发你从不同的角度来创建一个情节。这并不是用Matplotlib进行数据可视化最完备的教程,但我相信可以满足很多人的需求。

正如我之前提到的,我将指导你创建90个不同的绘图实例。这些例子分布在11种不同风格的图中:散点图、线图、直方图1D、2D、边际图、柱状图、盒状图、小提琴图、饼图、极地图、地理投影、3D图和等高线图。可以看图1,有一个大致的了解。
Python Data Visualization with Matplotlib — Part 1
Figure 1. Various types of plot generated in Matplotlib (Image by Author).

在这个故事中,我试图把重点放在创建和定制各种情节上。所以,我假设你已经知道了它之外的几种技术,例如,在Matplotlib中创建多个子图和自定义colormaps。如果你还不知道,我就给你一些链接来了解它。


01. Scatter plot

在本节中,有八个散点图的示例。在创建散点图之前,使用以下代码生成模拟数据:

import numpy as np
import matplotlib.pyplot as plt
N = 50
x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

变量x是值域从0到10的50个数据点组成的一维数组。变量y是基本函数sin(x)和cos(x)的复合函数。使用此代码以散点图的形式可视化,如图3所示。

plt.figure()
plt.scatter(x, y)

Python Data Visualization with Matplotlib — Part 1
Figure 3. Default scatter plot in Matplotlib (Image by Author).

为了使其更美观,可以减少每个数据的大小并使用此代码给标签。要更改颜色,需要添加此参数。

plt.scatter(x, y, s = 15, 
			label = r'$y  = sin^2(x) + cos(x)$',
			color = 'r', # r means red
			)

如果要使轴比例尺相同,可以使用此代码:

plt.axis('equal')

要为x轴和y轴创建轴标签,可以添加以下代码:

plt.xlabel(r'$x$ (rad)')
plt.ylabel(r'$y$')

已标记了散点图,但尚未将其显示为图例。使用以下代码显示它:

plt.legend()

保存图形的代码如下:

plt.savefig('scatter2.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

这是完整的代码:

N = 50

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

plt.figure()
plt.scatter(x, y, s = 15, label = r'$ y  = sin^2(x) + cos(x)$', color = 'r')
plt.axis('equal')

plt.legend()
plt.xlabel(r'$x$ (rad)')
plt.ylabel(r'$y$')

plt.savefig('scatter2.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

该代码将创建一个散点图,如图4所示。
Python Data Visualization with Matplotlib — Part 1
Figure 4. Modified scatter plot in Matplotlib (Image by Author).

可以看到轴内的x轴和y轴的刻度方向,并且使用的字体为LaTeX格式。如果要更改图形尺寸,可以在plt.figure()中添加图形尺寸参数

plt.figure(figsize=(7, 4.5))

Change marker style

要更改标记样式,例如,我要从点更改为十字,可以在plt.scatter中添加此参数。

marker = 'x'

结果如下:
Python Data Visualization with Matplotlib — Part 1
官方文档:HTML
Python Data Visualization with Matplotlib — Part 1


Customizing the size for each data

本小节将展示如何为每个数据创建大小不同的散点图,如图7所示。
Python Data Visualization with Matplotlib — Part 1
Figure 7. Customize the size of the scatter plot in Matplotlib (Image by Author).

为了创建它,我使用此代码为变量randx和randy生成了一个随机位置,从0到100。之后,生成在50到200之间的随机数据点大小。为了可视化它,只需使用此代码添加将在每个数据中应用的大小的参数。

创建图7的附加语法是在x轴和y轴上插入次刻度。要插入它,需要导入子模块MultipleLocator。

这是生成图7的完整代码。

np.random.seed(100)

N = 30

plt.figure(figsize=(7, 6))

randx = np.random.random(N) * 100
randy = np.random.random(N) * 100
size = np.random.randint(50, 200, size=N)

plt.scatter(randx, randy, s = size, color = 'darkorange')
plt.axis('equal')

ax = plt.gca()
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(10))

plt.xlabel('randx')
plt.ylabel('randy')

plt.savefig('scatter5.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Color-coded scatter plot

可以使用颜色图更改颜色。这意味着具有不同大小的数据将以不同的颜色进行颜色编码。可以像这样在plt.scatter()中添加颜色参数。

c = size

要嵌入颜色栏,可以使用以下代码:

plt.colorbar()

得到图8所示。
Python Data Visualization with Matplotlib — Part 1
Figure 8. Modify color-coded in scatter plot with Matplotlib (Image by Author).

这是生成图8的完整代码。

np.random.seed(100)

N = 30

randx = np.random.random(N) * 100
randy = np.random.random(N) * 100
ranking = np.random.random(N) * 200
size = np.random.randint(50, 200, size=N)

plt.figure(figsize=(7, 5))
plt.scatter(randx, randy, s = size, c = size, alpha = .8)
plt.axis('equal')

ax = plt.gca()
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(10))

plt.xlabel('randx')
plt.ylabel('randy')

plt.colorbar()

plt.savefig('scatter6.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Customizing the colormaps

你可以使用此参数更改颜色图:

cmap = 'inferno' 

# cmaps['Perceptually Uniform Sequential'] = ['viridis', 'plasma', 'inferno', 'magma', 'cividis']

你可以查看此链接以了解Matplotlib提供的所有颜色图。

在本教程中,我通过组合颜色图Blues和Oranges创建了自己的颜色图,如下图所示。

Python Data Visualization with Matplotlib — Part 1
我使用以下代码将其结合:

from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap
top = cm.get_cmap('Oranges_r', 128)
bottom = cm.get_cmap('Blues', 128)
newcolors = np.vstack((top(np.linspace(0, 1, 128)),
                       bottom(np.linspace(0, 1, 128))))
orange_blue = ListedColormap(newcolors, name='OrangeBlue')

我创建了自己的颜色图,名为orange_blue。要了解如何在Matplotlib中创建和自定义自己的颜色图,可以在以下链接中阅读它。

要应用它,只需更改颜色参数c = orange_blue。如图所示:
Python Data Visualization with Matplotlib — Part 1
上图的完整代码如下:

from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

top = cm.get_cmap('Oranges_r', 128)
bottom = cm.get_cmap('Blues', 128)

newcolors = np.vstack((top(np.linspace(0, 1, 128)),
                       bottom(np.linspace(0, 1, 128))))
orange_blue = ListedColormap(newcolors, name='OrangeBlue')

np.random.seed(100)

N = 30

randx = np.random.random(N) * 100
randy = np.random.random(N) * 100
size = np.random.randint(50, 200, size=N)

plt.figure(figsize=(7, 5))
plt.scatter(randx, randy, s = size, c = size, alpha = .8, cmap = orange_blue)
plt.axis('equal')

ax = plt.gca()
ax.xaxis.set_minor_locator(MultipleLocator(10))
ax.yaxis.set_minor_locator(MultipleLocator(10))

plt.xlabel('randx')
plt.ylabel('randy')

plt.colorbar(label = 'circle size')

plt.savefig('scatter7.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Python Data Visualization with Matplotlib — Part 1


02. Line plot

为了在Matplotlib中绘制线图,我将使用此代码生成模拟数据:

N = 50
x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

plt.plot(x, y)

Python Data Visualization with Matplotlib — Part 1


Customizing line styles

可以使用此参数在Matplotlib中更改线条图的线条样式。

linestyle = '-'

上面的参数应该以plt.plot()语法插入。在本教程中,我将展示四种不同的线条样式:

['-', '--', '-.', ':']

为了自动生成它,我使用循环使其变得简单。这是完整的代码:

N = 50

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

rows = 2
columns = 2

grid = plt.GridSpec(rows, columns, wspace = .25, hspace = .25)

linestyles = ['-', '--', '-.', ':']

plt.figure(figsize=(15, 10))
for i in range(len(linestyles)):
    plt.subplot(grid[i])
    plt.plot(x, y, linestyle = linestyles[i], label = r'$ y  = sin^2(x) + cos(x)$')
    plt.axis('equal')
    plt.xlabel('$x$ (rad)')
    plt.legend()
    plt.annotate("linestyle '" + str(linestyles[i]) + "'", xy = (0.5, -2.5), va = 'center', ha = 'left')
    
plt.savefig('line2.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

运行代码,结果如下:
Python Data Visualization with Matplotlib — Part 1
该代码将简单地生成4种不同的线型,并为每种线型添加标签和注释。 Matplotlib提供了许多可以使用的线型。可以通过此链接选择自己喜欢的线条样式。
Python Data Visualization with Matplotlib — Part 1


Customizing line width

要为线图自定义线宽,可以使用此参数:

lw = 2.0

我使用提供4种不同的线宽,结果如图所示:
Python Data Visualization with Matplotlib — Part 1
完整代码如下:

N = 50

rows = 2
columns = 2

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

grid = plt.GridSpec(rows, columns, wspace = .25, hspace = .25)

linewidth = [2, 3, 4, 5]

plt.figure(figsize=(15, 10))
for i in range(len(linestyles)):
    plt.subplot(grid[i])
    plt.plot(x, y, linestyle = '-.', lw = linewidth[i], label = r'$ y  = sin^2(x) + cos(x)$')
    plt.axis('equal')
    plt.xlabel('$x$ (rad)')
    plt.legend()
    plt.annotate("linewidth " + str(linewidth[i]), xy = (0.5, -2.5), va = 'center', ha = 'left')
    
plt.savefig('line3.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Creating mark every

本小节将为每个函数创建标记。为了理解它,我将首先显示结果,如图15所示。
Python Data Visualization with Matplotlib — Part 1
Figure 15. Mark every in Matplotlib (Image by Author).

在图15中,我为每5个数据创建一个圆圈标记。使用此参数创建:

'o'            # shape for each 5 data
markevery = 5  # mark every 
ms = 7         # size of the circle in mark every

这是完整的代码:

N = 50

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

plt.figure(figsize=(7, 4.5))

plt.plot(x, y, 'o', ls = '-.', lw = 2, ms = 7, markevery = 5, label = r'$ y  = sin^2(x) + cos(x)$')

plt.axis('equal')
plt.xlabel('$x$ (rad)')
plt.legend()
plt.annotate("markevery: 5", xy = (0.5, -2.5), va = 'center', ha = 'left')

plt.savefig('line4.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Changing the line color

要更改线条颜色,如以下代码所示:

color = 'royalblue'

使用循环生成4种不同的颜色和4种不同的标记,如图所示。
Python Data Visualization with Matplotlib — Part 1
完整代码如下:

N = 50

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

rows = 2
columns = 2

grid = plt.GridSpec(rows, columns, wspace = .25, hspace = .25)

mark = [2, 5, 10, 12]
color = ['#00429d', '#627c94', '#f4777f', '#93003a']

plt.figure(figsize=(15, 10))
for i in range(len(linestyles)):
    plt.subplot(grid[i])
    plt.plot(x, y, 'o', ls='-.', lw = 2, ms = 8, markevery=mark[i], color = color[i], label = r'$ y  = sin^2(x) + cos(x)$')
    plt.axis('equal')
    plt.annotate("markevery: " + str(mark[i]), xy = (0.5, -2.5), va = 'center', ha = 'left')
    plt.xlabel('$x$ (rad)')
    plt.legend()

plt.savefig('line5.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Inserting error in line plot

为了演示折线图中的误差线,我需要使用以下代码生成误差:

np.random.seed(100)
noise_x = np.random.random(N) * .2 + .1
noise_y = np.random.random(N) * .7 + .4

该代码将为noise_x生成从0.1到0.3的随机数,为noise_y生成从0.3到0.7的随机数。要为y轴插入误差线,可以使用以下代码:

plt.errorbar(x, y, yerr = noise_y)

要在x轴上插入误差线,可以使用此参数:

xerr = noise_x

图17是线图中误差线的示例。
Python Data Visualization with Matplotlib — Part 1
Figure 17. Creating an error bar plot in Matplotlib (Image by Author).

N = 25

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

np.random.seed(100)
noise_x = np.random.random(N) * .2 + .1
noise_y = np.random.random(N) * .7 + .4

plt.figure(figsize=(7, 4.5))
plt.errorbar(x, y, yerr = noise_y, xerr = noise_x, label = r'$ y  = sin^2(x) + cos(x)$')
plt.axis('equal')
plt.legend()
plt.xlabel('$x$ (rad)')

plt.savefig('line7.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

如果想显示数据而不显示线图,而仅显示误差线,则可以使用此参数:

fmt = 'o'    # shape of the data point
color = 'r'  # color of the data point
ecolor ='k'   # color of the error bar

完整代码如下:

N = 25

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

np.random.seed(100)
noise_x = np.random.random(N) * .2 + .1
noise_y = np.random.random(N) * .7 + .4

plt.figure(figsize=(7, 4.5))
plt.errorbar(x, y, xerr = noise_x, yerr = noise_y, label = r'$ y  = sin^2(x) + cos(x)$', color = 'r', fmt = 'o', ecolor='k', )
plt.axis('equal')
plt.legend()
plt.xlabel('$x$ (rad)')

plt.savefig('line8.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

上面的代码将显示一个图,如图所示。
Python Data Visualization with Matplotlib — Part 1


Filling the error area

要显示错误,你可以使用此代码:

plt.fill_between(x, y + noise, y - noise, alpha = .5)

fill_between参数是x轴的数据,填充区域的上限和下限。在上面的代码中,它由y +噪声和y-噪声表示。需要降低填充区域的透明度,这是完整的代码

N = 25
x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

np.random.seed(100)
noise = np.random.random(N) * .7 + .4

plt.figure(figsize=(7, 4.5))
plt.plot(x, y, ls='-', label = r'$ y  = sin^2(x) + cos(x)$')
plt.fill_between(x, y + noise, y - noise, alpha = .5)
plt.axis('equal')
plt.legend()
plt.xlabel('$x$ (rad)')

plt.savefig('line9.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

运行上面的代码,结果如图所示:
Python Data Visualization with Matplotlib — Part 1
Figure 20. Creating fill between the area in Matplotlib (Image by Author).


Inserting the vertical and horizontal lines

可以使用此代码插入水平线和垂直线:

plt.hlines(0, xmin = 0, xmax = 10)
plt.vlines(2, ymin = -3, ymax = 3)

你需要在第一个参数中定义水平线,然后是水平线的起点和终点。对于垂直线,它具有类似的参数。

下图是插入水平线和垂直线的示例。
Python Data Visualization with Matplotlib — Part 1
完整代码如下:

N = 25

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

np.random.seed(100)
noise = np.random.random(N) * .7 + .4

plt.figure(figsize=(7, 4.5))
plt.plot(x, y, ls = '-', label = r'$ y  = sin^2(x) + cos(x)$', color = 'darkgreen')
plt.fill_between(x, y + noise, y - noise, color = 'darkgreen', alpha = .5)
plt.axis('equal')


plt.hlines(0, xmin = 0, xmax = 10, ls = '--', color = 'royalblue', label = 'hlines')
plt.vlines(2, ymin = -3, ymax = 3, ls = '--', color = 'orange', label = 'vlines')


plt.legend(bbox_to_anchor=(1.55, 1.04)) # position of the legend
plt.xlabel('$x$ (rad)')

plt.savefig('line10.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Filling between two vertical lines

本小节将在两条垂直线之间绘制一个填充区域,如图所示。
Python Data Visualization with Matplotlib — Part 1
完整代码如下:

N = 25

x = np.linspace(0., 10., N)
y = np.sin(x)**2 + np.cos(x)

np.random.seed(100)
noise = np.random.random(N) * .7 + .4

plt.figure(figsize=(7, 4.5))
plt.plot(x, y, ls='-', label = r'$ y  = sin^2(x) + cos(x)$', color = 'darkgreen')
plt.fill_between(x, y + noise, y - noise, color = 'darkgreen', alpha = .5)

plt.axis('equal')

plt.fill_between((2,4), -3.2, 3.2, facecolor='orange', alpha = 0.4)

plt.xlim(0, 10)
plt.ylim(-3, 3)

plt.legend()
plt.xlabel('$x$ (rad)')

plt.savefig('line11.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

03. Histogram

本节将说明如何在1D和2D中制作直方图。首先,我将介绍一维直方图。在可视化一维直方图之前,我将使用此代码制作一个模拟数据,即正态分布随机数。

N = 1000
np.random.seed(10021)
x = np.random.randn(N) * 2 + 15

默认情况下,Numpy将生成一个正态分布的随机数,其均值/中位数(mu)等于0,方差(sigma)等于1。在上面的代码中,我将mu更改为15,将sigma更改为2。要在一维直方图中可视化变量x ,可以使用此代码:

plt.hist(x)

Python Data Visualization with Matplotlib — Part 1
Matplotlib将为一维直方图生成10个bin作为默认设置。如果要更改箱(bins)数量,可以使用此参数。

bins = 40

该参数将生成具有40个bin的一维直方图,如图24所示。
Python Data Visualization with Matplotlib — Part 1
这是创建图24的完整代码。

N = 1000
np.random.seed(10021)
x = np.random.randn(N) * 2 + 15
plt.figure(figsize=(9, 6))
plt.hist(x, bins = 40, label = r'$\mu = 15, \sigma = 2$')
plt.legend()

使用此参数限制直方图的范围:

range = (12, 18)

Python Data Visualization with Matplotlib — Part 1
完整代码如下:

N = 1000

np.random.seed(10021)
x = np.random.randn(N) * 2 + 15

plt.figure(figsize=(9, 6))

plt.hist(x, bins = 40, range = (12, 18), color = 'darkorange', label = r'$\mu = 15, \sigma = 2$')

plt.legend()
plt.savefig('hist3.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Horizontal histogram

你可以创建一个水平直方图,如图所示。
Python Data Visualization with Matplotlib — Part 1
需要使用此参数来创建水平直方图:

orientation = 'horizontal'

如果要显示每个直方图的边框,可以使用此参数:

edgecolor = 'k'

Python Data Visualization with Matplotlib — Part 1
完整代码如下:

N = 1000

np.random.seed(10021)
x = np.random.randn(N) * 2 + 15

plt.figure(figsize=(9, 6))
plt.hist(x, bins = 25, range = (12, 18), color = 'royalblue', orientation='horizontal',  edgecolor='k', label = r'$\mu = 15, \sigma = 2$')
plt.legend()

plt.savefig('hist5.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

Overlapping histogram

可以在一个图中显示许多直方图,如图27所示。
Python Data Visualization with Matplotlib — Part 1
在上图中,我生成了三个正态分布,分别具有不同的mu和sigma。

可以通过更改直方图的透明度(alpha参数)使其更漂亮,如图所示。
Python Data Visualization with Matplotlib — Part 1
代码如下:

N = 1000
mu1 = 5
mu2 = 10
mu3 = 15
sigma1 = 5
sigma2 = 3
sigma3 = 2
x1 = np.random.randn(N) * sigma1 + mu1
x2 = np.random.randn(N) * sigma2 + mu2
x3 = np.random.randn(N) * sigma3 + mu3
mu = np.array([mu1, mu2, mu3])
sigma = np.array([sigma1, sigma2, sigma3])
x = np.array([x1, x2, x3])
colors = ['royalblue', 'tomato', 'gray']

plt.figure(figsize=(9, 6))

for i in range(len(x)):
    plt.hist(x[i], bins = 30, color = colors[i], 
             label = r'$\mu = $ ' + str(mu[i]) + 
             ', $\sigma = $ ' + str(sigma[i]), alpha = .7)

plt.legend()

2D histogram

可以使用Matplotlib生成2D直方图,如图所示。
Python Data Visualization with Matplotlib — Part 1

要创建上图,需要使用此代码生成2个正态分布。

N = 1_000
np.random.seed(100)
x = np.random.randn(N)
y = np.random.randn(N)

要在2D直方图中可视化变量x和y,可以使用此代码。

plt.hist2d(x, y)

与1D直方图一样,Matplotlib将生成10个bin作为2D直方图的默认设置。要对其进行更改,可以应用与一维直方图中相同的参数,如下面的代码所示。

bins = (25, 25)

Python Data Visualization with Matplotlib — Part 1
还可以使用此参数更改2D直方图的颜色图:

cmap = orange_blue

这是修改2D直方图中使用的色图的完整代码。

from matplotlib import cm
from matplotlib.colors import ListedColormap, LinearSegmentedColormap

top = cm.get_cmap('Oranges_r', 128)
bottom = cm.get_cmap('Blues', 128)

newcolors = np.vstack((top(np.linspace(0, 1, 128)),
                       bottom(np.linspace(0, 1, 128))))
orange_blue = ListedColormap(newcolors, name='OrangeBlue')

N = 10_000

np.random.seed(100)
x = np.random.randn(N)
y = np.random.randn(N)

plt.figure(figsize=(8.5, 7))
plt.hist2d(x, y, bins=(75, 75), cmap = orange_blue)
cb = plt.colorbar()
cb.set_label('counts each bin', labelpad = 10)

plt.savefig('hist12.png', dpi = 300, bbox_inches = 'tight', facecolor='w')

运行上面的代码,创建的图形如图所示。
Python Data Visualization with Matplotlib — Part 1
可以通过将此参数应用于plt.hist2d()来限制每个计数的范围(更改颜色条的限制)。

cmin = 5, cmax = 25

Python Data Visualization with Matplotlib — Part 1


Marginal plot

本小节将介绍如何创建边际分布,如图35所示。
Python Data Visualization with Matplotlib — Part 1
Figure 35. The marginal plot from scatter distribution and histogram in Matplotlib (Image by Author).

图35由散点图和2个直方图构建。要创建它,您需要了解如何在单个图形中自定义子图或轴。图35由25个轴(5列5行)构成。详细信息如图36所示。

Python Data Visualization with Matplotlib — Part 1
Figure 36. Multiple subplots in Matplotlib (Image by Author).

rows = 5
columns = 5
grid = plt.GridSpec(rows, columns, wspace = .4, hspace = .4)
plt.figure(figsize=(10, 10))
for i in range(rows * columns):
    plt.subplot(grid[i])   
    plt.annotate('grid '+ str(i), xy = (.5, .5), ha = 'center', 
                 va = 'center')
for i in range(rows):
    exec (f"plt.subplot(grid[{i}, 0])")
    plt.ylabel('rows ' + str(i), labelpad = 15)
for i in range(columns):
    exec (f"plt.subplot(grid[-1, {i}])")
    plt.xlabel('column ' + str(i), labelpad = 15)

图35显示了图36的转换。我将图36中的某些网格合并为仅3个较大的网格。第一个网格将网格0合并到网格3(行1,列0到列3)。我将用直方图填充第一个网格。第二个网格合并从第1行到第4行以及从第0列到第3列的16个网格。最后一个网格是通过合并网格9、14、19和24(行1、2、3、4和列4)构建的。

要创建第一个网格,可以使用此代码。

rows = 5
columns = 5
grid = plt.GridSpec(rows, columns, wspace = .4, hspace = .4)
plt.figure(figsize=(10, 10))
plt.subplot(grid[0, 0:-1])

之后,添加以下代码以插入一维直方图:

plt.hist(x, bins = 30, color = 'royalblue', alpha = .7)

要创建第二个网格,可以将此代码添加到上面的代码中

plt.subplot(grid[1:rows+1, 0:-1])

添加此代码以在第二个网格中生成散点图。

plt.scatter(x, y, color = 'royalblue', s = 10)
plt.axis('equal')

这是生成第三个网格及其直方图的代码。您需要将下面的代码插入第一个网格代码中:

plt.subplot(grid[1:rows+1, -1])
plt.hist(y, bins = 30, orientation='horizontal', color = 'royalblue', alpha = .7)

以上完整代码如下所示:

N = 10_000

np.random.seed(100)
x = np.random.randn(N)
y = np.random.randn(N)

rows = 5
columns = 5

grid = plt.GridSpec(rows, columns, wspace = .4, hspace = .4)

plt.figure(figsize=(10, 10))

plt.subplot(grid[0, 0:-1])
plt.hist(x, bins = 30, color = 'royalblue', alpha = .7)

plt.subplot(grid[1:rows+1, 0:-1])
plt.scatter(x, y, color = 'royalblue', s = 10)
plt.axis('equal')

plt.subplot(grid[1:rows+1, -1])
plt.hist(y, bins = 30, orientation='horizontal', color = 'royalblue', alpha = .7)

Python Data Visualization with Matplotlib — Part 1

可以使用此代码重现上图。

N = 10_000

np.random.seed(100)
x = np.random.randn(N)
y = np.random.randn(N)

rows = 5
columns = 5

grid = plt.GridSpec(rows, columns, wspace = .4, hspace = .4)

plt.figure(figsize=(10, 10))

plt.subplot(grid[0, 0:-1])
plt.hist(x, bins = 40, color = 'royalblue', alpha = .3)
plt.annotate('Normal 1', xy = (2, 500), va = 'center', ha = 'left')

plt.subplot(grid[1:rows+1, 0:-1])
plt.hist2d(x, y, cmap = 'Blues', bins = (40, 40))
plt.axis('equal')

plt.subplot(grid[1:rows+1, -1])
plt.hist(y, bins = 40, orientation='horizontal', color = 'royalblue', alpha = .3)
plt.annotate('Normal 2', xy = (500, 2), va = 'bottom', ha = 'center', rotation = -90)

04. Bar chart

如果想用条形图可视化数据,这很适合。像往常一样,在Matplotlib中创建条形图之前,我想创建要显示的模拟数据。我想在数学考试成绩中创建六个人的数据。要创建它,我使用以下代码。

name = ['Adam', 'Barry', 'Corbin', 'Doe', 'Evans', 'Frans']
np.random.seed(100)
N = len(name)
math = np.random.randint(60, 100, N)

我生成的数学考试成绩从60到100。要使其形象化,可以使用此代码。

plt.bar(name, math, alpha = .7)

Python Data Visualization with Matplotlib — Part 1
完整代码:

name = ['Adam', 'Barry', 'Corbin', 'Doe', 'Evans', 'Frans']
np.random.seed(100)
N = len(name)
math = np.random.randint(60, 100, N)
plt.figure(figsize=(9, 6))
plt.bar(name, math, alpha = .7)
plt.ylabel('Math Exam')

之后,我使用此代码为物理,生物学和化学考试成绩创建了更多模拟数据。

np.random.seed(100)
N = len(name)
math = np.random.randint(60, 100, N)
physics = np.random.randint(60, 100, N)
biology = np.random.randint(60, 100, N)
chemistry = np.random.randint(60, 100, N)

Python Data Visualization with Matplotlib — Part 1
完整代码如下:

name = ['Adam', 'Barry', 'Corbin', 'Doe', 'Evans', 'Frans']
course_name = ['Math', 'Physics', 'Biology', 'Chemistry']
N = len(name)
rows = 2
columns = 2
plt.figure(figsize=(12, 8))
grid = plt.GridSpec(rows, columns, wspace = .25, hspace = .25)

for i in range(len(course_name)):
    np.random.seed(100)
    course = np.random.randint(60, 100, N)
    plt.subplot(grid[i])
    plt.bar(name, course, alpha = .7)
    plt.ylabel(course_name[i] + ' Exam')
    plt.ylim(60, 100)

Horizontal bar chart

效果图:
Python Data Visualization with Matplotlib — Part 1
完整代码:

name = ['Adam', 'Barry', 'Corbin', 'Doe', 'Evans', 'Frans']
course_name = ['Math', 'Physics', 'Biology', 'Chemistry']
colors = ['#00429d', '#7f40a2', '#a653a1', '#c76a9f', 
          '#e4849c', '#d0e848']
N = len(name)
rows = 2
columns = 2
plt.figure(figsize=(12, 8))
grid = plt.GridSpec(rows, columns, wspace = .25, hspace = .25)

for i in range(len(course_name)):
    np.random.seed(100)
    course = np.random.randint(60, 100, N)
    plt.subplot(grid[i])
    plt.barh(name, course, color = colors)
    plt.xlabel(course_name[i] + ' Exam')
    plt.xlim(60, 100)


    plt.gca().invert_yaxis()

可以使用此参数在水平条形图中插入误差线:

N = len(name)
noise = np.random.randint(1, 3, N)
plt.barh(name, course, xerr = noise)

我使用1到3之间的整数随机数创建了错误,如变量noise中所述。在为水平条形图添加一些元素之后,我将其显示出来,如图42所示。
Python Data Visualization with Matplotlib — Part 1
完整代码如下:

name = ['Adam', 'Barry', 'Corbin', 'Doe', 'Evans', 'Frans']
course_name = ['Math', 'Physics', 'Biology', 'Chemistry']
N = len(name)
rows = 2
columns = 2
plt.figure(figsize=(12, 8))
grid = plt.GridSpec(rows, columns, wspace = .25, hspace = .25)
np.random.seed(100)
for i in range(len(course_name)):
    course = np.random.randint(60, 95, N)
    noise = np.random.randint(1, 3, N)
    plt.subplot(grid[i])
    plt.barh(name, course, color = colors, xerr = noise, 
             ecolor = 'k')
    plt.xlabel(course_name[i] + ' Exam')
    plt.xlim(60, 100)
    plt.gca().invert_yaxis()

这是第1部分,我尝试限制阅读时间(少于30分钟),以便你可以享受阅读的乐趣。本部分仅涵盖11个部分中的4个部分,包括散点图,折线图,直方图和条形图。在下一部分中,我将显示教程以创建箱形图,小提琴图,饼图,极坐标图,地理投影,3D图和轮廓图。

上一篇:python-Altair复选框默认


下一篇:Javascript-为什么D3.js不显示我的geoJSON文件?