安装 pip install matplotlib
官方文档 https://matplotlib.org/stable/api/pyplot_summary.html
主要介绍一些图片绘制的简要使用,更加详细和进阶需要可参考 以上官方文档。
1 绘制基础
方法名 | 说明 |
---|---|
title() | 设置图表的名称 |
xlabel() | 设置 x 轴名称 |
ylabel() | 设置 y 轴名称 |
xticks(x, ticks, rotation) | 设置 x 轴的刻度, rotation 为旋转角度 |
yticks() | 设置 y 轴的刻度 |
plot() | 绘制线性图表 |
show() | 显示图表 |
legend() | 显示图例 |
text(x, y, text) | 显示每条数据的值,x, y 为值的位置 |
figure(name, figsize=(w, h), dpi=n) | 设置图片大小,name 为图片名称,figsize 为图片宽高尺寸,dpi 为图片分辨率 |
1.1 基础方法
import matplotlib.pyplot as plt
plt.plot([0,2],[1,4]) # 将 (0,1) (2,4) 两点连成一条直线
plt.show()
# 绘制折线
plt.plot([0,1,2,3],[0,1,4,9])
plt.show()
plt.plot([0,1,2,3],[0,1,4,9], linewidth=5) # 设置线条宽度
plt.title("y = x ^ 2") # 设置图形的标题
plt.xlabel("x") # 设置图形 x 轴标签
plt.ylabel("y") # 设置图形 y 轴标签
plt.show()
# 绘制一元二次方程曲线
x = range(-100, 100) # x 的刻度越细 曲线越平滑
y = [i**2 for i in x]
plt.title("y = x ^ 2") # 设置图形的标题
plt.plot(x, y)
plt.show()
# 绘制正弦曲线和余弦曲线
import numpy as np
x = np.linspace(-2*np.pi, 2*np.pi, 100)
y1 = np.sin(x)
y2 = np.cos(x)
plt.title("sin(x) and cos(x)")
plt.xlabel("x")
plt.ylabel("y")
plt.plot(x, y1)
plt.plot(x, y2)
plt.legend(["sin(x)", "cos(x)"], loc="best")
plt.show()
1.2 绘制子图
x = np.linspace(1, 10, 100)
# 调整子图间距
plt.subplots_adjust(wspace=0.4, hspace=0.6) # 增加子图之间的宽度间距
plt.subplot(2, 2, 1)
plt.title("sin(x)")
plt.xlabel("x")
plt.ylabel("six(x)")
plt.plot(x, np.sin(x))
plt.subplot(2, 2, 2)
plt.title("cos(x)")
plt.xlabel("x")
plt.ylabel("cos(x)")
plt.plot(x, np.cos(x))
plt.subplot(2, 2, 3)
plt.title("tan(x)")
plt.xlabel("x")
plt.ylabel("tan(x)")
plt.plot(x, np.tan(x))
plt.subplot(2, 2, 4)
plt.title("log(x)")
plt.xlabel("x")
plt.ylabel("log(x)")
plt.plot(x, np.log(x))
plt.show()
也可以获取子图的对象进行对应的设置
# 创建一些数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)
# 创建一个 figure 和两个子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 4))
# 绘制第一个子图
ax1.plot(x, y1, color='blue')
ax1.set_title('Sine Function')
ax1.set_xlabel('X axis')
ax1.set_ylabel('Y axis')
# 绘制第二个子图
ax2.plot(x, y2, color='red')
ax2.set_title('Cosine Function')
ax2.set_xlabel('X axis')
ax2.set_ylabel('Y axis')
# 调整子图间距
plt.subplots_adjust(wspace=0.4) # 增加子图之间的宽度间距
# 显示图表
plt.show()
2 绘制散点图
关于点样式的写法可参考 官网文档 https://matplotlib.org/stable/api/pyplot_summary.html
x = np.arange(6)
plt.plot(x, x, "ro") # 红色圆点 plt.plot(x, x ** 2, "g+") # 绿色加号
plt.show()
plt.close() # 关闭当前的 plt 重新开始绘图
plt.scatter(x, x)
plt.show()
# 绘制 10种大小 100种颜色的散点图
np.random.seed(42)
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.random.rand(100)
size = np.tile(np.random.rand(10), 10) * 100 # 生成 10个大小 需要复制 10次
np.random.shuffle(size) # 打乱大小
plt.scatter(x, y, c=colors, s=size, alpha=0.5)
3 绘制柱状图
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
my_font = font_manager.FontProperties(fname='./simhei.ttf')
x= np.linspace(0, 20, 4) # x 轴 柱的位置
x_labels=['2000 年','2001 年','2002 年','2003 年'] # x轴的标签
y=[1000,3000,4000,5000]
plt.bar(x,y,width=3)
plt.xticks(x,x_labels, fontproperties=my_font) # 修改 x 轴的 标签
plt.xlabel('年份', fontproperties=my_font)
plt.ylabel('销量', fontproperties=my_font)
plt.title('根据年份销量对比图', fontproperties=my_font)
plt.show()
real_names=['A 公司','B 公司','C 公司']
real_num1=[2314,4521,5632]
real_num2=[2211,1223,2222]
real_num3=[1115,1111,3333]
#生成 x 第 1 天 第 2 天 第 3 天
x=np.arange(len(real_names))
x_label=['第{}天'.format(i+1) for i in range(len(real_names))]
#绘制柱状图
#设置柱的宽度
width=0.3
plt.bar(x,real_num1,color='g',width=width,label=real_names[0])
plt.bar([i+width for i in x],real_num2,color='b',width=width,label=real_names[1])
plt.bar([i+2*width for i in x],real_num3,color='r',width=width,label=real_names[2])
#修改 x 坐标
plt.xticks([i+width for i in x],x_label, fontproperties=my_font)
#添加图例
plt.legend(loc="best", labels=real_names, prop=my_font)
#添加标题
plt.title('3 天的销售量', fontproperties=my_font)
plt.show()
4 绘制饼状图
import matplotlib.pyplot as plt
import numpy as np
male = 200
female = 150
male_percent = male / (male + female)
female_percent = female / (male + female)
labels = ['male', 'female']
colors = ['lightblue', 'pink']
paches, text, autotexts = plt.pie([male_percent, female_percent], labels=labels, colors=colors, autopct= '%0.1f%%')
# 设置饼状图中的字体颜色与字体大小
for text in autotexts:
text.set_color('white')
text.set_fontsize(20)
plt.title('Gender Distribution')
plt.show()
pandas DataFrame 的某一列绘制饼状图
# Import
import pandas as pd
import matplotlib.pyplot as plt
df_raw = pd.read_csv("https://github.com/selva86/datasets/raw/master/mpg_ggplot2.csv")
plt.figure(figsize=(8, 8), dpi= 100)
# Prepare Data
df = df_raw.groupby('class').size()
# Make the plot with pandas
df.plot(kind='pie', subplots=True, figsize=(8, 8))
plt.title("Pie Chart of Vehicle Class - Bad")
plt.ylabel("")
plt.show()
5 绘制直方图
直方图和柱状图很类似。
直方图是用来观察分布状态的
柱状图是用来看每一个 X 坐标对应的 Y 值
直方图关注的是分布,并不关心具体的某个值。
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(2000)
# plt.hist(x)
plt.hist(x, bins= 100) # 分成 100份
plt.show()
同一个画布绘制三个直方图
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(8,8), dpi=100) # figsize用来设置图片大小, dpi 设置图像清晰度
x1 = np.random.normal(0, 0.8, 1000)
x2 = np.random.normal(-1, 1, 1000)
x3 = np.random.normal(2, 2, 1000)
kwargs = dict(bins=100, alpha=0.5)
plt.hist(x1, **kwargs)
plt.hist(x2, **kwargs)
plt.hist(x3, **kwargs)
plt.show()
6 绘制等高线图
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sqrt(X**2 + Y**2)
plt.contourf(X, Y, Z)
plt.contour(X, Y, Z)
# 颜色越深表示值越小 中间的黑色表示 z = 0plt.show()
- 导入所需的库:matplotlib.pyplot和numpy。
- 使用numpy的linspace函数生成一个从-5到5的等间距数组,数组大小为100
- 使用numpy的meshgrid函数将x和y转换为网格
- 计算z=sqrt(x^2 + y^2),其中x和y是网格的坐标
- 使用matplotlib的contourf函数绘制等值线filled contour图。contourf函数会填充z值大于某个阈值的区域
- 使用matplotlib的contour函数绘制等值线contour图
- 最后,使用matplotlib的show函数显示图形。
7 绘制三维图
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 创建 X、Y、Z 坐标
X = np.linspace(-5, 5, 100)
Y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(X, Y)
Z = np.sin(np.sqrt(X**2 + Y**2))
# 创建3D图
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 绘制3D曲面
ax.plot_surface(X, Y, Z, cmap='viridis')
# 设置坐标轴标签
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
# 显示图形
plt.show()