绘图3(饼图,桑基图,三维图像)

饼图

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"""
绘制饼图的代码。
1.显示比例关系:饼图能够直观地显示数据各部分与整体的比例关系,帮助人们快速了解数据的分布情况。
2.突出占比较大部分:饼图的饼片大小与所占比例成正比,使得占比较大的部分更加突出,便于观察主要数据。
3.相对数量比较:饼图适用于展示相对数量的比较,特别是对于几个类别之间的比例关系。
4.简单易懂:饼图是一种简单易懂的图表类型,不需要复杂的数学知识就可以理解数据的占比情况。
5.适用于少量分类:饼图适用于较少的分类,当分类较多时,饼图的可读性和解析性可能会下降。
6.可以显示百分比:饼图可以自动计算并显示每个类别的百分比,进一步增强了数据的可读性。
7.适用于非连续数据:饼图适用于离散的、非连续的数据,如分类数据、百分比等。
"""
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 为了支持中文字体
plt.rcParams['axes.unicode_minus'] = False # 上述字库没负号,因此负号不进行字体变换

# 生成示例数据
labels1 = ['Group 1', 'Group 2', 'Group 3']
labels2 = ['Group 4', 'Group 5', 'Group 6']
sizes1 = [30, 20, 50]
sizes2 = [25, 35, 30] # 这里存放数据,并不是比例,因此求和不一定是100

# 设置颜色列表
colors1 = ['tab:blue', 'tab:orange', 'tab:green']
colors2 = ['tab:red', 'tab:purple', 'tab:brown']

# 创建一个Figure对象和一个子图
fig, ax = plt.subplots()

# 绘制饼图,并设置样式和颜色
wedges1, texts1, autotexts1 = ax.pie(sizes1, pctdistance=0.8, labels=labels1, colors=colors1, autopct='%1.2f%%',
startangle=90, wedgeprops=dict(edgecolor='w')) # pctdistance=0.8调整文字位置
wedges2, texts2, autotexts2 = ax.pie(sizes2, colors=colors2, radius=0.5, autopct='%1.1f%%', startangle=90,
wedgeprops=dict(edgecolor='w')) # radius=0.5调整半径大小

# 设置文本标签字体大小和颜色
for autotext in autotexts1 + autotexts2:
autotext.set_fontsize(15)
# autotext.set_color('white')

# 设置图例
ax.legend(wedges1 + wedges2, labels1 + labels2, loc='best')

# 添加图表标题
ax.set_title('三组数据的饼图', fontsize=14, fontweight='bold')

# 设置背景颜色
ax.set_facecolor('#f0f0f0')

# 显示图形
plt.show()

桑基图

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
33
34
35
36
37
38
"""
绘制桑基图的代码
"""
import plotly.graph_objects as go

# 输入数据
label = ["A", "B", "C", "D", "E"]
source = [0, 0, 1, 1, 2, 2, 3, 3] # 前一列的索引
target = [2, 3, 2, 4, 3, 4, 3, 4] # 后一列的索引
value = [8, 4, 2, 6, 2, 6, 4, 2] # 对应的流量值

# 创建桑基图对象
fig = go.Figure(data=[go.Sankey(
node=dict(
pad=15,
thickness=20,
line=dict(color="black", width=0.5),
label=label,
# color="blue" # 设置节点颜色
),
link=dict(
source=source,
target=target,
value=value,
# color="rgba(255, 0, 0, 0.5)", # 设置链接颜色和透明度
)
)])

# 设置图的标题和大小
fig.update_layout(title_text="桑基图", title_x=0.5, title_font_size=24)
fig.update_layout(width=800, height=600)

# 隐藏坐标轴
fig.update_xaxes(showline=False, showgrid=False, zeroline=False, showticklabels=False)
fig.update_yaxes(showline=False, showgrid=False, zeroline=False, showticklabels=False)

# 显示图形
fig.show()

3D函数图像

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
"""
3D函数图像绘制代码
"""
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 为了支持中文字体
plt.rcParams['axes.unicode_minus'] = False # 上述字库没负号,因此负号不进行字体变换

# 定义函数
def f(x, y):
return np.sin(np.sqrt(x**2 + y**2))

# 生成网格点
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
# print(X)
Z = f(X, Y)

# 创建3D图形对象
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')

# 绘制立体函数图像
surf = ax.plot_surface(X, Y, Z, cmap='viridis', edgecolor='black', alpha=0.8)

# 添加横纵坐标label
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 添加图的标题
plt.title('3D立体函数图像')

# 设置刻度标签
ax.set_xticks(np.arange(-5, 6, 2))
ax.set_yticks(np.arange(-5, 6, 2))
ax.set_zticks(np.arange(-1, 1.5, 0.5))

# 设置轴范围
ax.set_xlim(-5, 5)
ax.set_ylim(-5, 5)
ax.set_zlim(-1, 1)

# 添加颜色条
fig.colorbar(surf, shrink=0.5, aspect=5)

# 旋转视角,调整角度
ax.view_init(elev=30, azim=30)

# 隐藏边框
ax.xaxis.pane.fill = False
ax.yaxis.pane.fill = False
ax.zaxis.pane.fill = False
ax.xaxis.pane.set_edgecolor('w')
ax.yaxis.pane.set_edgecolor('w')
ax.zaxis.pane.set_edgecolor('w')
ax.grid(True)

# 显示图形
plt.show()

3D散点图

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""
3D散点图像绘制代码
"""
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['SimHei'] # 为了支持中文字体
plt.rcParams['axes.unicode_minus'] = False # 上述字库没负号,因此负号不进行字体变换

# 生成示例数据
np.random.seed(0)
cluster1 = np.random.randn(100, 3) + [3, 3, 3]
cluster2 = np.random.randn(100, 3) + [-2, -2, -2]
cluster3 = np.random.randn(100, 3) + [1, -1, 4]

# 创建3D图形对象
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制三维数据点
ax.scatter(cluster1[:, 0], cluster1[:, 1], cluster1[:, 2], color='r', marker='o', label='Cluster 1', alpha=0.8)
ax.scatter(cluster2[:, 0], cluster2[:, 1], cluster2[:, 2], c='g', marker='^', label='Cluster 2', alpha=0.8)
ax.scatter(cluster3[:, 0], cluster3[:, 1], cluster3[:, 2], c='b', marker='s', label='Cluster 3', alpha=0.8)

# 添加图例,设置位置为右上角
ax.legend(loc='upper right')

# 添加横纵坐标label
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')

# 添加图的标题
plt.title('三维三点聚类图像', fontsize=16, fontweight='bold')

# 设置坐标轴刻度范围
ax.set_xlim(-6, 6)
ax.set_ylim(-6, 6)
ax.set_zlim(-6, 6)

# 设置坐标轴刻度间隔
# ax.set_xticks(np.arange(-6, 7, 2))
# ax.set_yticks(np.arange(-6, 7, 2))
# ax.set_zticks(np.arange(-6, 7, 2))


# 隐藏边框和网格
# ax.xaxis.pane.fill = False
# ax.yaxis.pane.fill = False
# ax.zaxis.pane.fill = False
# ax.xaxis.pane.set_edgecolor('black')
# ax.yaxis.pane.set_edgecolor('black')
# ax.zaxis.pane.set_edgecolor('black')
# ax.grid(True)


# 调整视角
ax.view_init(elev=20, azim=30)

# 显示图形
plt.show()

3D柱状体

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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
"""
3D柱状图绘制代码
"""
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 为了支持中文字体
plt.rcParams['axes.unicode_minus'] = False # 上述字库没负号,因此负号不进行字体变换

# 示例数据
x = [1, 2, 3]
y = [1, 2, 3, 4, 5]
z = [
[5, 4, 2],
[7, 6, 3],
[7, 5, 4],
[6, 7, 3],
[5, 6, 2]
]

# 创建3D图形对象
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 绘制三维柱状图
dx = dy = 0.5 # 设置柱子的宽度
dz = [row[0] for row in z] # 设置柱子的高度

color = ['tab:red', 'y', 'tab:green']
for i in range(len(x)):
for j in range(len(y)):
ax.bar3d(x[i], y[j], 0, dx, dy, dz[j], shade=True, color=color[i], edgecolor='black',
linewidth=1, alpha=0.7)

# 创建虚拟的图例
rect1 = plt.Rectangle((0, 0), 1, 1, fc=color[0], edgecolor='black', linewidth=1)
rect2 = plt.Rectangle((0, 0), 1, 1, fc=color[1], edgecolor='black', linewidth=1)
rect3 = plt.Rectangle((0, 0), 1, 1, fc=color[2], edgecolor='black', linewidth=1)
ax.legend([rect1, rect2, rect3], ['Category 1', 'Category 2', 'Category 3'], loc='upper left')
# 添加横纵坐标label
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')

# 添加图的标题
plt.title('三维柱状图')

# 显示图形
plt.show()
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
Runtime Display
  • Copyrights © 2023-2024 Lucas
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信