Matploylib绘制常用图像

文章发布时间:

最后更新时间:

文章总字数:
1.5k

预计阅读时间:
6 分钟

一.柱状图

1
ax.bar(x, height, width=0.8, bottom=None, align='center', **kwargs)
  • x : 柱状图的 X 轴位置,就是柱子的标签。

  • height : 柱状图的高度,就是y的值。

  • width : 柱状图的宽度,默认为 0.8。

  • bottom : 柱状图的底部位置,默认为 0,也就是原点叫啥名取啥值。

  • align : 柱状图与标签的对齐方式,可以是 ‘center’(居中对齐)或 ‘edge’(边缘对齐)。

  • **kwargs : 其他可选参数,用于定制柱状图的外观,如 color、edgecolor、linewidth 等。

1
2
3
4
5
6
7
8
9
10
11
12
13
import matplotlib.pyplot as plt
import numpy as np

# 给定标签
labels = ['A','B','C','D']

# 给定高度
values = [10,20,30,40]

# 绘制柱状图
plt.bar(labels,values,0.5,align='edge',color='orange')

plt.show()

结果:

1.1 堆叠柱状图

啥意思?就是柱状图上方又有柱状图,两个不同的东西连在一起。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np

# 给定标签
labels = ['A','B','C','D']

# 给定高度
values = [10,20,30,40]
values1 = [1,2,3,4]

plt.bar(labels,values,color = 'green')

# 设置bottom就是完成堆叠的重要一步
plt.bar(labels,values1,bottom= values,color = 'red')

plt.show()

结果:

1.2 分组柱状图

就是把一个标签占的地方分成几份,然后按自定义的大小绘制各自的图像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 数据
categories = ['A', 'B', 'C', 'D']
values1 = [20, 35, 30, 25]
values2 = [15, 25, 20, 10]

# 创建图形和子图
fig, ax = plt.subplots()

# 计算柱状图的位置
x = np.arange(len(categories))
width = 0.35

# 绘制第一个数据集的柱状图
ax.bar(x - width/2, values1, width, color='skyblue', label='Values 1')

# 绘制第二个数据集的柱状图
ax.bar(x + width/2, values2, width, color='lightgreen', label='Values 2')

# 设置 X 轴标签
ax.set_xticks(x)
ax.set_xticklabels(categories)

# 设置标题和标签
ax.set_title('Grouped Bar Chart')
ax.set_xlabel('Categories')
ax.set_ylabel('Values')

# 添加图例
ax.legend()

# 显示图形
plt.show()

结果:

二.直方图

与柱状图的本质区别是所有柱子连在一起。

1
ax.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, **kwargs)
  • x: 数据数组。

  • bins : 直方图的柱数,可以是整数或序列。

  • range : 直方图的范围,格式为 (min, max)。

  • density : 是否将直方图归一化,默认为 False。

  • weights : 每个数据点的权重。

  • cumulative : 是否绘制累积直方图,默认为 False。

  • **kwargs : 其他可选参数,用于定制直方图的外观,如 color、edgecolor、linewidth 等。

1
2
3
4
5
6
7
8
from matplotlib import pyplot as plt
import numpy as np

# 生成一个正太分布的数据组
b = np.random.randn(1000)

plt.hist(b, bins = 100,range=(-5,5))
plt.show()

结果:

三.饼图

1
ax.pie(x, explode=None, labels=None, colors=None, autopct=None, shadow=False, startangle=0, **kwargs)
  • x: 数据数组,表示每个扇区的占比。

  • explode : 一个数组,表示每个扇区偏离圆心的距离,默认为 None。

  • labels : 每个扇区的标签,默认为 None。

  • colors : 每个扇区的颜色,默认为 None。

  • autopct : 控制显示每个扇区的占比,可以是格式化字符串或函数,默认为 None。

  • shadow : 是否显示阴影,默认为 False。

  • startangle : 饼图的起始角度,默认为 0。

  • **kwargs : 其他可选参数,用于定制饼图的外观。

1
2
3
4
5
6
7
8
from matplotlib import pyplot as plt
import numpy as np

a = np.arange(0, 7)
label = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
plt.pie(a,labels = label,autopct='%1.1f%%')

plt.show()

结果:

四.散点图

1
ax.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None, **kwargs)
  • x : X 轴数据。

  • y : Y 轴数据。

  • s : 点的大小,可以是标量或数组。

  • c : 点的颜色,可以是标量、数组或颜色列表。

  • marker : 点的形状,默认为 ‘o’(圆圈)。

  • cmap : 颜色映射,用于将颜色映射到数据。

  • norm : 归一化对象,用于将数据映射到颜色映射。

  • vmin, vmax : 颜色映射的最小值和最大值。

  • alpha : 点的透明度,取值范围为 0 到 1。

  • linewidths : 点的边框宽度。

  • edgecolors : 点的边框颜色。

  • **kwargs : 其他可选参数,用于定制散点图的外观。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from matplotlib import pyplot as plt

# 这里直接用的现成的代码,重点是看怎么设计的绘图

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

fig = plt.figure()
axes = fig.add_axes([.1,.1,.8,.8])

# 自定义数据
x = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
data = [
[120, 132, 101, 134, 90, 230, 210],
[220, 182, 191, 234, 290, 330, 310],
]

y0 = data[0]
y1 = data[1]

# 绘制图像
axes.scatter(x,y0,color='red')
axes.scatter(x,y1,color='blue')

axes.set_title('散点图')
axes.set_xlabel('日期')
axes.set_ylabel('数量')

plt.legend(labels=['Email', 'Union Ads'],)
plt.show()

结果:

五.图片读取

plt.imread,用于读取图像文件并将其转换为 NumPy 数组。

参数:

  • fname : 图像文件的路径(字符串)。

  • format : 图像格式(可选)。如果未指定,imread 会根据文件扩展名自动推断格式。

返回:

一个 NumPy 数组,表示图像的像素数据。数组的形状取决于图像的格式:

  • 对于灰度图像,返回一个二维数组 (height, width)。

  • 对于彩色图像,返回一个三维数组 (height, width, channels),其中 channels 通常是 3(RGB)或 4(RGBA),其中的A可能是透明度。

1
2
3
4
from matplotlib import pyplot as plt

a = plt.imread('yumaobi1.jpg')
print(a.shape)

结果:

1
2
3
(1024, 1024, 3)
c:\Users\Clocky7\anaconda3\envs\pyhon-numpy\lib\site-packages\PIL\TiffImagePlugin.py:949: UserWarning: Corrupt EXIF data. Expecting to read 4 bytes but only got 0.
warnings.warn(str(msg))

图片转置:

1
2
3
4
5
6
7
8
9
10
from matplotlib import pyplot as plt
import numpy as np

a = plt.imread('yumaobi1.jpg')

# transpose可以有第二个参数axis,其中传入一个元组,包含0,1,2三个元素,表示height、width和channel的下标,即默认顺序
# 这里写成(2,0,1)因为想把channel放在最前面,所以转置之后就变成了(3, 1024, 1024)
b = np.transpose(a,(2,0,1))

print(b.shape)

结果:

1
(3, 1024, 1024)