Liu/picture.py

164 lines
6.2 KiB
Python
Raw Normal View History

# ===============================================================
2023-11-27 15:56:15 +08:00
# 画图柱状图散点图拆线图3D图概率分布图累计概率分布图
# ===============================================================
2023-11-27 15:56:15 +08:00
from mpl_toolkits.mplot3d import Axes3D
2023-11-27 15:56:15 +08:00
import numpy as np
import matplotlib.pyplot as plt
# ===============================================================
2023-11-27 15:56:15 +08:00
# 柱状图
plt.subplot(221) # 创建一个两行两列的子图列表,并选取左上角第一个子图作为当前子图
2023-11-27 15:56:15 +08:00
size = 5
x = np.arange(size) # 返回等差数列从0开始到5默认步长为1
a = np.random.random(size) # 返回五个随机数范围0-1
2023-11-27 15:56:15 +08:00
b = np.random.random(size)
width = 0.3
plt.bar(x+width/2, a, label='a', width=width)
plt.bar(x+width*3/2, b, label='b', width=width)
'''
plt.bar Matplotlib 库中的一个函数用于创建柱状图它的语法如下
plt.bar(x, height, width=0.8, align='center', **kwargs)
参数说明
x:柱状图的 x 坐标位置,可以是一个数值序列或类别名称序列
height:柱状图的高度,可以是一个数值序列表示每个柱的高度
width:柱状图的宽度,默认为 0.8
align:柱状图的对齐方式,默认为 'center'表示柱状图的中心与 x 坐标对齐
**kwargs:可选的关键字参数,用于设置柱状图的其他属性,如颜色标签等
plt.bar 函数会根据给定的 x 坐标位置和高度创建柱状图可以通过设置不同的参数来调整柱状图的样式和属性,如宽度对齐方式颜色等
'''
2023-11-27 15:56:15 +08:00
plt.legend()
plt.xlabel('x-axis')
plt.ylabel('y-axis')
plt.title('plot')
plt.show()
2023-11-27 15:56:15 +08:00
# ===============================================================
2023-11-27 15:56:15 +08:00
# 散点图
plt.subplot(222) # 创建一个两行两列的子图列表,并选取右上角第一个子图作为当前子图
x = np.random.random(10)
y = np.random.random(10)
plt.scatter(x, y, s=15, c='b', marker=(6, 1), alpha=0.7, lw=2)
# 设置xy轴的范围
plt.xlim(0, 1)
plt.ylim(0, 1)
plt.show()
# ===============================================================
2023-11-27 15:56:15 +08:00
# 拆线图
plt.subplot(223) # 创建一个两行两列的子图列表,并选取左下角第一个子图作为当前子图
2023-11-27 15:56:15 +08:00
size = 5
x = np.arange(size)
a = np.random.random(size)
b = np.random.random(size)
plt.plot(x, a, marker='o', mec='b', mfc='b', label=u'y=a')
"""
使用 Matplotlib 库中的 plot 函数绘制折线图它的语法如下
plt.plot(x, y, **kwargs)
参数说明
x:x 轴上的数据点可以是一个数值序列
y:y 轴上的数据点可以是一个数值序列
**kwargs:可选的关键字参数用于设置折线图的其他属性如标记样式线条颜色标签等
在代码中,x x 轴上的数据点,a y 轴上的数据点marker='o' 设置折线图上的标记样式为圆圈,mec='b' mfc='b' 设置标记的边框颜色和填充颜色都为蓝色label=u'y=a' 设置折线图的标签为 "y=a"
通过调用 plt.plot 函数可以将数据点连接起来生成一条折线图可以通过设置不同的参数来调整折线图的样式和属性如标记样式线条颜色标签等
"""
plt.plot(x, b, marker='*', ms=10, label=u'y=b')
2023-11-27 15:56:15 +08:00
plt.legend()
plt.xlabel('x-axis')
plt.ylabel('y-axis')
plt.title('plot')
plt.show()
# ===============================================================
2023-11-27 15:56:15 +08:00
# 3D图
# ===============================================================
2023-11-27 15:56:15 +08:00
# plt.subplot(224)
# 定义函数
2023-11-27 15:56:15 +08:00
def rand_range(n, vmin, vmax):
'''
make an array of random numbers having shape (n, )
with each number distributed Uniform(vmin, vmax).
'''
return (vmax - vmin) * np.random.rand(n) + vmin
2023-11-27 15:56:15 +08:00
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d') # 在fig对象中添加一个三维子图
2023-11-27 15:56:15 +08:00
# plot n random points in the box
# defined by x in [23, 32], y in [0, 100], z in [zlow, zhigh].
n = 5
# 添加不同格式的点第一种为红色圆点z取值范围为-50~-25第二种为蓝色三角形点z取值范围在-30~-5
2023-11-27 15:56:15 +08:00
for c, m, zlow, zhigh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]:
xs = rand_range(n, 20, 30)
ys = rand_range(n, 30, 100)
zs = rand_range(n, zlow, zhigh)
ax.scatter(xs, ys, zs, c=c, marker=m)
# 单独一个散点(绿色星型)
2023-11-27 15:56:15 +08:00
ax.scatter(25, 50, -25, c='g', marker="*")
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()
# ===============================================================
2023-11-27 15:56:15 +08:00
# 概率分布图,累计概率分布图
# ===============================================================
2023-11-27 15:56:15 +08:00
# 概率分布直方图
# 高斯分布
mean = 0 # 均值为0
sigma = 1 # 标准差为1反应数据集中还是分散的值
x = mean+sigma*np.random.randn(10000)
# 第二个参数是柱子宽一些还是窄一些,越大越窄越密
fig, (ax0, ax1) = plt.subplots(nrows=2, figsize=(6, 6))
"""
参数说明
nrows=2:指定子图的行数为 2
figsize=(6, 6)指定图像窗口的大小为 6x6 英寸
plt.subplots 函数返回一个包含子图对象的元组,其中的每个子图对象可以通过元组解包的方式分别赋值给不同的变量在这个例子中,ax0 ax1 分别表示第一个子图和第二个子图
2023-11-27 15:56:15 +08:00
通过创建包含多个子图的图像窗口可以在不同的子图上绘制不同的图形或数据并且可以通过调整子图的位置大小等属性来自定义图像的布局
"""
2023-11-27 15:56:15 +08:00
# pdf概率分布图一万个数落在某个区间内的数有多少个
ax0.hist(x, bins=40, density=True, histtype='bar',
facecolor='green', alpha=0.8, rwidth=0.8) # bins参数表示将数据分成几组
2023-11-27 15:56:15 +08:00
ax0.set_title('pdf')
# cdf累计概率函数cumulative累计。比如需要统计小于5的数的概率
2023-11-27 15:56:15 +08:00
# bins参数表示将数据分成几组
# normed 是否对y轴数据进行标准化:True表是在本区间的点在所有的点中所占的概率如果 normed 为False 则是显示点的数量
ax1.hist(x, bins=20, density=False, histtype='step',
facecolor='blue', alpha=0.8, cumulative=True, rwidth=0.8)
2023-11-27 15:56:15 +08:00
ax1.set_title("cdf")
fig.subplots_adjust(hspace=0.4) # 调整子图间的垂直间距
2023-11-27 15:56:15 +08:00
plt.show()
# plt.draw()
2023-11-27 15:56:15 +08:00
# 可用 help(function) 查看函数帮助help(ax.plot_surface)
# ===============================================================