import matplotlib.pyplot as plt
import numpy as np
import matplotlib
import pandas as pd
xpoints = np.array([0, 6])
ypoints = np.array([0, 100])
# plot():用于绘制线图和散点图
plt.plot(xpoints, ypoints)
plt.show()
# 如果我们只想绘制两个坐标点,而不是一条线,可以使用 o 参数,表示一个实心圈的标记:
xpoints = np.array([1, 8])
ypoints = np.array([3, 10])
plt.plot(xpoints, ypoints, 'o')
plt.show()
# 绘制一个正弦和余弦图,在 plt.plot() 参数中包含两对 x,y 值,第一对是 x,y,这对应于正弦函数,第二对是 x,z,这对应于余弦函数。
x = np.arange(0, 4 * np.pi, 0.1) # start,stop,step
y = np.sin(x)
z = np.cos(x)
plt.plot(x, y, x, z)
plt.show()
# 绘图过程如果我们想要给坐标自定义一些不一样的标记,就可以使用 plot() 方法的 marker 参数来定义。
ypoints = np.array([1, 3, 4, 5, 8, 9, 6, 1, 3, 4, 5, 2, 4])
plt.plot(ypoints, marker='o')
plt.show()
plt.plot(ypoints, marker='*')
plt.show()
# fmt 参数
# fmt 参数定义了基本格式,如标记、线条样式和颜色。
#
# fmt = '[marker][line][color]'
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, 'o:r')
plt.show()
# 标记大小与颜色
# 我们可以自定义标记的大小与颜色,使用的参数分别是:
# markersize,简写为 ms:定义标记的大小。
# markerfacecolor,简写为 mfc:定义标记内部的颜色。
# markeredgecolor,简写为 mec:定义标记边框的颜色。
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, marker='o', ms=20, mec='#4CAF50', mfc='#4CAF50')
plt.show()
# 线的类型可以使用 linestyle 参数来定义,简写为 ls。
# 线的颜色可以使用 color 参数来定义,简写为 c。
# 线的宽度可以使用 linewidth 参数来定义,简写为 lw,值可以是浮点数,如:1、2.0、5.67 等。
ypoints = np.array([6, 2, 13, 10])
plt.plot(ypoints, c='SeaGreen')
plt.plot(ypoints, c='#8FBC8F')
plt.plot(ypoints, ls='-.')
plt.plot(ypoints, linewidth='12.5')
plt.show()
# 我们可以使用 xlabel() 和 ylabel() 方法来设置 x 轴和 y 轴的标签。
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.plot(x, y)
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.show()
# 我们可以使用 title() 方法来设置标题。
# 可以自定义字体的样式:
# title() 方法提供了 loc 参数来设置标题显示的位置,可以设置为: 'left', 'right', 和 'center', 默认值为 'center'。
#
# xlabel() 方法提供了 loc 参数来设置 x 轴显示的位置,可以设置为: 'left', 'right', 和 'center', 默认值为 'center'。
#
# ylabel() 方法提供了 loc 参数来设置 y 轴显示的位置,可以设置为: 'bottom', 'top', 和 'center', 默认值为 'center'。
# 可以使用 pyplot 中的 grid() 方法来设置图表中的网格线。
#
# grid() 方法语法格式如下:
#
# matplotlib.pyplot.grid(b=None, which='major', axis='both', )
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.title("RUNOOB grid() Test")
plt.xlabel("x - label")
plt.ylabel("y - label")
plt.plot(x, y)
plt.grid()
plt.show()
# 可以使用 pyplot 中的 subplot() 和 subplots() 方法来绘制多个子图。
#
# subplot() 方法在绘图时需要指定位置,subplots() 方法可以一次生成多个,在调用时只需要调用生成对象的 ax 即可。
# subplot(nrows, ncols, index, **kwargs)
# 以上函数将整个绘图区域分成 nrows 行和 ncols 列,然后从左到右,从上到下的顺序对每个子区域进行编号 1...N ,左上的子区域的编号为 1、右下的区域编号为 N,编号可以通过参数 index 来设置。
#
# 设置 numRows = 1,numCols = 2,就是将图表绘制成 1x2 的图片区域, 对应的坐标为:
#
# (1, 1), (1, 2)
# plotNum = 1, 表示的坐标为(1, 1), 即第一行第一列的子图。
#
# plotNum = 2, 表示的坐标为(1, 2), 即第一行第二列的子图。
# plot 1:
xpoints = np.array([0, 6])
ypoints = np.array([0, 100])
plt.subplot(1, 2, 1)
plt.plot(xpoints, ypoints)
plt.title("plot 1")
# plot 2:
x = np.array([1, 2, 3, 4])
y = np.array([1, 4, 9, 16])
plt.subplot(1, 2, 2)
plt.plot(x, y)
plt.title("plot 2")
plt.suptitle("RUNOOB subplot Test")
plt.show()
# 使用 pyplot 中的 scatter() 方法来绘制散点图。
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
plt.scatter(x, y)
plt.show()
# 设置图标大小
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
sizes = np.array([20, 50, 100, 200, 500, 1000, 60, 90])
plt.scatter(x, y, s=sizes)
plt.show()
# 自定义点的颜色
x = np.array([1, 2, 3, 4, 5, 6, 7, 8])
y = np.array([1, 4, 9, 16, 7, 11, 23, 18])
colors = np.array(["red", "green", "black", "orange", "purple", "beige", "cyan", "magenta"])
plt.scatter(x, y, c=colors)
plt.show()
# 使用 pyplot 中的 bar() 方法来绘制柱形图。
#
# bar() 方法语法格式如下:
#
# matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)
x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y)
plt.show()
# 垂直方向的柱形图可以使用 barh() 方法来设置:
x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])
plt.barh(x, y)
plt.show()
# 设置柱形图颜色:
x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, color="#4CAF50")
plt.show()
# 自定义各个柱形的颜色:
x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, color=["#4CAF50", "red", "hotpink", "#556B2F"])
plt.show()
# 设置柱形图宽度,bar() 方法使用 width 设置,barh() 方法使用 height 设置 height
x = np.array(["Runoob-1", "Runoob-2", "Runoob-3", "C-RUNOOB"])
y = np.array([12, 22, 6, 18])
plt.bar(x, y, width=0.1)
plt.show()
# 饼图(Pie Chart)是一种常用的数据可视化图形,用来展示各类别在总体中所占的比例。
#
# 我们可以使用 pyplot 中的 pie() 方法来绘制饼图。
#
# pie() 方法语法格式如下:
#
# matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=0, radius=1, counterclock=True, wedgeprops=None, textprops=None, center=0, 0, frame=False, rotatelabels=False, *, normalize=None, data=None)[source]
# 参数说明:
#
# x:浮点型数组或列表,用于绘制饼图的数据,表示每个扇形的面积。
#
# explode:数组,表示各个扇形之间的间隔,默认值为0。
#
# labels:列表,各个扇形的标签,默认值为 None。
#
# colors:数组,表示各个扇形的颜色,默认值为 None。
#
# autopct:设置饼图内各个扇形百分比显示格式,%d%% 整数百分比,%0.1f 一位小数, %0.1f%% 一位小数百分比, %0.2f%% 两位小数百分比。
#
# labeldistance:标签标记的绘制位置,相对于半径的比例,默认值为 1.1,如 <1则绘制在饼图内侧。
#
# pctdistance::类似于 labeldistance,指定 autopct 的位置刻度,默认值为 0.6。
#
# shadow::布尔值 True 或 False,设置饼图的阴影,默认为 False,不设置阴影。
#
# radius::设置饼图的半径,默认为 1。
#
# startangle::用于指定饼图的起始角度,默认为从 x 轴正方向逆时针画起,如设定 =90 则从 y 轴正方向画起。
#
# counterclock:布尔值,用于指定是否逆时针绘制扇形,默认为 True,即逆时针绘制,False 为顺时针。
#
# wedgeprops :字典类型,默认值 None。用于指定扇形的属性,比如边框线颜色、边框线宽度等。例如:wedgeprops={'linewidth':5} 设置 wedge 线宽为5。
# textprops :字典类型,用于指定文本标签的属性,比如字体大小、字体颜色等,默认值为 None。
# center :浮点类型的列表,用于指定饼图的中心位置,默认值:(0,0)。
# frame :布尔类型,用于指定是否绘制饼图的边框,默认值:False。如果是 True,绘制带有表的轴框架。
# rotatelabels :布尔类型,用于指定是否旋转文本标签,默认为 False。如果为 True,旋转每个 label 到指定的角度。
# data:用于指定数据。如果设置了 data 参数,则可以直接使用数据框中的列作为 x、labels 等参数的值,无需再次传递。
#
# 除此之外,pie() 函数还可以返回三个参数:
#
# wedges:一个包含扇形对象的列表。
#
# texts:一个包含文本标签对象的列表。
#
# autotexts:一个包含自动生成的文本标签对象的列表。
y = np.array([35, 25, 25, 15])
plt.pie(y)
plt.show()
# 设置饼图各个扇形的标签与颜色:
y = np.array([35, 25, 25, 15])
plt.pie(y,
labels=['A', 'B', 'C', 'D'], # 设置饼图标签
colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色
)
plt.title("RUNOOB Pie Test") # 设置标题
plt.show()
# 突出显示第二个扇形,并格式化输出百分比:
# 数据
sizes = [15, 30, 45, 10]
# 饼图的标签
labels = ['A', 'B', 'C', 'D']
# 饼图的颜色
colors = ['yellowgreen', 'gold', 'lightskyblue', 'lightcoral']
# 突出显示第二个扇形
explode = (0, 0.1, 0, 0)
# 绘制饼图
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=90)
# 标题
plt.title("RUNOOB Pie Test")
# 显示图形
plt.show()
y = np.array([35, 25, 25, 15])
plt.pie(y,
labels=['A', 'B', 'C', 'D'], # 设置饼图标签
colors=["#d5695d", "#5d8ca8", "#65a479", "#a564c9"], # 设置饼图颜色
explode=(0, 0.2, 0, 0), # 第二部分突出显示,值越大,距离中心越远
autopct='%.2f%%', # 格式化输出百分比
)
plt.title("RUNOOB Pie Test")
plt.show()
# 可以使用 pyplot 中的 hist() 方法来绘制直方图。
#
# hist() 方法是 Matplotlib 库中的 pyplot 子库中的一种用于绘制直方图的函数。
#
# hist() 方法可以用于可视化数据的分布情况,例如观察数据的中心趋势、偏态和异常值等。
#
# hist() 方法语法格式如下:
#
# matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, **kwargs)
# 参数说明:
#
# x:表示要绘制直方图的数据,可以是一个一维数组或列表。
# bins:可选参数,表示直方图的箱数。默认为10。
# range:可选参数,表示直方图的值域范围,可以是一个二元组或列表。默认为None,即使用数据中的最小值和最大值。
# density:可选参数,表示是否将直方图归一化。默认为False,即直方图的高度为每个箱子内的样本数,而不是频率或概率密度。
# weights:可选参数,表示每个数据点的权重。默认为None。
# cumulative:可选参数,表示是否绘制累积分布图。默认为False。
# bottom:可选参数,表示直方图的起始高度。默认为None。
# histtype:可选参数,表示直方图的类型,可以是'bar'、'barstacked'、'step'、'stepfilled'等。默认为'bar'。
# align:可选参数,表示直方图箱子的对齐方式,可以是'left'、'mid'、'right'。默认为'mid'。
# orientation:可选参数,表示直方图的方向,可以是'vertical'、'horizontal'。默认为'vertical'。
# rwidth:可选参数,表示每个箱子的宽度。默认为None。
# log:可选参数,表示是否在y轴上使用对数刻度。默认为False。
# color:可选参数,表示直方图的颜色。
# label:可选参数,表示直方图的标签。
# stacked:可选参数,表示是否堆叠不同的直方图。默认为False。
# **kwargs:可选参数,表示其他绘图参数。
# 生成一组随机数据
data = np.random.randn(1000)
# 绘制直方图
plt.hist(data, bins=30, color='skyblue', alpha=0.8)
# 设置图表属性
plt.title('RUNOOB hist() Test')
plt.xlabel('Value')
plt.ylabel('Frequency')
# 显示图表
plt.show()
# 使用 hist() 函数绘制多个数据组的直方图,并进行比较:
# 生成三组随机数据
data1 = np.random.normal(0, 1, 1000)
data2 = np.random.normal(2, 1, 1000)
data3 = np.random.normal(-2, 1, 1000)
# 绘制直方图
plt.hist(data1, bins=30, alpha=0.5, label='Data 1')
plt.hist(data2, bins=30, alpha=0.5, label='Data 2')
plt.hist(data3, bins=30, alpha=0.5, label='Data 3')
# 设置图表属性
plt.title('RUNOOB hist() TEST')
plt.xlabel('Value')
plt.ylabel('Frequency')
plt.legend()
# 显示图表
plt.show()
# 结合 Pandas 来绘制直方图:
# 使用 NumPy 生成随机数
random_data = np.random.normal(170, 10, 250)
# 将数据转换为 Pandas DataFrame
dataframe = pd.DataFrame(random_data)
# 使用 Pandas hist() 方法绘制直方图
dataframe.hist()
# 设置图表属性
plt.title('RUNOOB hist() Test')
plt.xlabel('X-Value')
plt.ylabel('Y-Value')
# 显示图表
plt.show()
# 可以使用 Pandas 中的 Series 对象绘制直方图。只需将数据框中的列替换为 Series 对象即可。
# 生成随机数据
data = pd.Series(np.random.normal(size=100))
# 绘制直方图
# bins 参数指定了直方图中的柱子数量
plt.hist(data, bins=10)
# 设置图形标题和坐标轴标签
plt.title('RUNOOB hist() Tes')
plt.xlabel('X-Values')
plt.ylabel('Y-Values')
# 显示图形
plt.show()
# imshow() 函数是 Matplotlib 库中的一个函数,用于显示图像。
#
# imshow() 函数常用于绘制二维的灰度图像或彩色图像。
#
# imshow() 函数可用于绘制矩阵、热力图、地图等。
#
# imshow() 方法语法格式如下:
#
# imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=None, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, *, data=None, **kwargs)
# 参数说明:
#
# X:输入数据。可以是二维数组、三维数组、PIL图像对象、matplotlib路径对象等。
# cmap:颜色映射。用于控制图像中不同数值所对应的颜色。可以选择内置的颜色映射,如gray、hot、jet等,也可以自定义颜色映射。
# norm:用于控制数值的归一化方式。可以选择Normalize、LogNorm等归一化方法。
# aspect:控制图像纵横比(aspect ratio)。可以设置为auto或一个数字。
# interpolation:插值方法。用于控制图像的平滑程度和细节程度。可以选择nearest、bilinear、bicubic等插值方法。
# alpha:图像透明度。取值范围为0~1。
# origin:坐标轴原点的位置。可以设置为upper或lower。
# extent:控制显示的数据范围。可以设置为[xmin, xmax, ymin, ymax]。
# vmin、vmax:控制颜色映射的值域范围。
# filternorm 和 filterrad:用于图像滤波的对象。可以设置为None、antigrain、freetype等。
# imlim: 用于指定图像显示范围。
# resample:用于指定图像重采样方式。
# url:用于指定图像链接。
# 显示灰度图像
# 生成一个二维随机数组
img = np.random.rand(10, 10)
# 绘制灰度图像
plt.imshow(img, cmap='gray')
# 显示图像
plt.show()
# 显示彩色图像
# 生成一个随机的彩色图像
img = np.random.rand(10, 10, 3)
# 绘制彩色图像
plt.imshow(img)
# 显示图像
plt.show()
# 显示热力图
# 生成一个二维随机数组
data = np.random.rand(10, 10)
# 绘制热力图
plt.imshow(data, cmap='hot')
# 显示图像
plt.colorbar()
plt.show()
# 显示矩阵
# 生成一个随机矩阵
data = np.random.rand(10, 10)
# 绘制矩阵
plt.imshow(data)
# 显示图像
plt.show()
# 以下创建了一个 4x4 的二维 numpy 数组,并对其进行了三种不同的 imshow 图像展示。
#
# 第一张展示了灰度的色彩映射方式,并且没有进行颜色的混合(blending)。
# 第二张展示了使用viridis颜色映射的图像,同样没有进行颜色的混合。
# 第三张展示了使用viridis颜色映射的图像,并且使用了双立方插值方法进行颜色混合。
n = 4
# 创建一个 n x n 的二维numpy数组
a = np.reshape(np.linspace(0, 1, n ** 2), (n, n))
plt.figure(figsize=(12, 4.5))
# 第一张图展示灰度的色彩映射方式,并且没有进行颜色的混合
plt.subplot(131)
plt.imshow(a, cmap='gray', interpolation='nearest')
plt.xticks(range(n))
plt.yticks(range(n))
# 灰度映射,无混合
plt.title('Gray color map, no blending', y=1.02, fontsize=12)
# 第二张图展示使用viridis颜色映射的图像,同样没有进行颜色的混合
plt.subplot(132)
plt.imshow(a, cmap='viridis', interpolation='nearest')
plt.yticks([])
plt.xticks(range(n))
# Viridis映射,无混合
plt.title('Viridis color map, no blending', y=1.02, fontsize=12)
# 第三张图展示使用viridis颜色映射的图像,并且使用了双立方插值方法进行颜色混合
plt.subplot(133)
plt.imshow(a, cmap='viridis', interpolation='bicubic')
plt.yticks([])
plt.xticks(range(n))
# Viridis 映射,双立方混合
plt.title('Viridis color map, bicubic blending', y=1.02, fontsize=12)
plt.show()
# imsave() 方法是 Matplotlib 库中用于将图像数据保存到磁盘上的函数。
#
# 通过 imsave() 方法我们可以轻松将生成的图像保存到我们指定的目录中。
#
# imsave() 方法保存图片支持多种图像格式,例如 PNG、JPEG、BMP 等。
#
# imsave() 方法的语法如下:
#
# matplotlib.pyplot.imsave(fname, arr, **kwargs)
# 参数说明:
#
# fname:保存图像的文件名,可以是相对路径或绝对路径。
# arr:表示图像的NumPy数组。
# kwargs:可选参数,用于指定保存的图像格式以及图像质量等参数。
# 创建一个二维的图像数据
img_data = np.random.random((100, 100))
# 显示图像
plt.imshow(img_data)
# 保存图像到磁盘上
plt.imsave('runoob-test.png', img_data)
# imread() 方法是 Matplotlib 库中的一个函数,用于从图像文件中读取图像数据。
#
# imread() 方法返回一个 numpy.ndarray 对象,其形状是 (nrows, ncols, nchannels),表示读取的图像的行数、列数和通道数:
#
# 如果图像是灰度图像,则 nchannels 为 1。
# 如果是彩色图像,则 nchannels 为 3 或 4,分别表示红、绿、蓝三个颜色通道和一个 alpha 通道。
# imread() 方法的语法如下:
#
# matplotlib.pyplot.imread(fname, format=None)
# 参数说明:
#
# fname:指定了要读取的图像文件的文件名或文件路径,可以是相对路径或绝对路径。
# format :参数指定了图像文件的格式,如果不指定,则默认根据文件后缀名来自动识别格式。
img = plt.imread('map.jpeg')
# 显示图像
plt.imshow(img)
plt.show()
# 我们可以通过更改 numpy 数组来修改图像。
# 如果我们将数组乘以一个数 0≤≤1,我们将图像变暗
img_array = plt.imread('tiger.jpeg')
tiger = img_array / 255
# print(tiger)
# 显示图像
plt.figure(figsize=(10, 6))
for i in range(1, 5):
plt.subplot(2, 2, i)
x = 1 - 0.2 * (i - 1)
plt.axis('off') # hide coordinate axes
plt.title('x={:.1f}'.format(x))
plt.imshow(tiger * x)
plt.show()
# 以下实例用于裁剪图像:
img_array = plt.imread('tiger.jpeg')
tiger = img_array / 255
# print(tiger)
# 显示图像
plt.figure(figsize=(6, 6))
plt.imshow(tiger[:300, 100:400, :])
plt.axis('off')
plt.show()
# 将 RGB 颜色的绿色和蓝色坐标的数组元素设置为 0,我们将得到红色的图像:
img_array = plt.imread('tiger.jpeg')
tiger = img_array / 255
# print(tiger)
# 显示图像
red_tiger = tiger.copy()
red_tiger[:, :, [1, 2]] = 0
plt.figure(figsize=(10, 10))
plt.imshow(red_tiger)
plt.axis('off')
plt.show()
ref: https://matplotlib.org/stable/tutorials/introductory/quick_start.html
ref: https://www.runoob.com/matplotlib/matplotlib-tutorial.html