Python绘制曲线图(基于Matplotlib库)
Python绘制曲线图(基于Matplotlib库)
目录
1 Matplotlib简介
Matplotlib是一个Python的绘图库,它可以在各种平台上以各种硬拷贝格式和交互式环境生成具有出版品质的图形,适用于数据分析和可视化的各种场景。无论是简单的折线图还是复杂的三维可视化,Matplotlib都能轻松胜任。
1.1 基本概念
元素:Matplotlib中的基本图表包括x轴、y轴、x轴和y轴刻度、x轴和y轴刻度标签、绘图区域等元素。
容器:图(figure)、坐标系(axes)、坐标轴(axis)、刻度(tick)等。
刻度表示:线(line)、点(marker)、文本(text)、图例(legend)、网格(grid)、标题(title)等。
1.21 绘图类型
Matplotlib提供了多种绘图类型,包括但不限于:
线形图:使用plot()
函数绘制。
直方图:使用hist()
函数绘制,用于展示数据的分布情况。
条形图:使用bar()
函数绘制,用于比较不同类别的数据。
饼图:使用pie()
函数绘制,用于展示数据的占比情况。
散点图:使用scatter()
函数绘制,用于展示两个变量之间的关系。
3D图:使用mpl_toolkits.mplot3d中的Axes3D绘制三维图形。
1.3 安装与配置
安装:可以使用pip命令安装Matplotlib,例如pip install matplotlib
。需要注意的是,Matplotlib需要numpy等库的支持。
配置:Matplotlib的配置信息是从配置文件读取的,可以在配置文件中为Matplotlib的几乎所有属性指定永久有效的默认值。配置文件分为安装级配置文件、系统级配置文件和用户级配置文件。动态配置也可以在程序中直接进行,以覆盖配置文件的设置。
1.4 基本用法
导入库:通常使用import matplotlib.pyplot as plt
来导入Matplotlib库。
创建图形:使用plt.figure()
函数创建一个新的图形(figure)。
绘制图形:使用相应的绘图函数(如plot()
、hist()
、bar()
等)在图形上绘制数据。
设置样式:可以通过绘图函数的可选参数或返回的Artist对象来设置图形的样式和属性,如线条颜色、线条样式、标记样式等。
保存图形:使用plt.savefig()
函数可以将图形保存为多种格式,包括PNG、PDF、SVG等。
显示图形:使用plt.show()
函数可以在屏幕上显示图形。
1.5 高级功能
子图:可以使用plt.subplot()
函数在一个图形中创建多个子图。
网格线:使用plt.grid()
函数可以为图形添加网格线。
图例:使用plt.legend()
函数可以为图形添加图例,以区分不同的数据系列。
坐标轴设置:可以使用plt.xlabel()
、plt.ylabel()
、plt.title()
等函数设置坐标轴的标签和图形的标题。使用plt.xlim()
和plt.ylim()
函数可以设置坐标轴的范围。
交互式绘图:Matplotlib支持交互式绘图,可以响应用户操作。与Jupyter Notebook和IPython配合使用,可以创建动态的交互式图表。
2 使用方法
2.1 导入Matplotlib
首先需要导入Matplotlib的pyplot模块。
示例代码如下:
import matplotlib.pyplot as plt
2.2 准备数据
在绘图之前,需要准备要绘制的数据,可以是列表、NumPy数组或其他可迭代对象,或者自定义数据。
以numpy为例,示例代码如下:
import numpy as np
x = np.linspace(0, 10, 100) # 在0到10之间生成100个等间距的点
y = np.sin(x) # 计算这些点的正弦值
2.3 创建图形和坐标轴
使用plt.figure()
可以创建一个新的图形窗口(尽管在大多数情况下,Matplotlib会自动处理这个步骤)。
然后,可以使用plt.plot()
、plt.scatter()
等函数在图形上绘制数据。
示例代码如下:
# 创建图形和坐标轴(这一步通常是隐式的)
plt.plot(x, y) # 在坐标轴上绘制x和y的数据点,并连接成线
2.4 自定义图表(可选)
可以通过添加标题、标签、图例、网格等来增强图表的可读性和吸引力。
plt.title('Sine Wave') # 添加标题
plt.xlabel('x values') # 添加x轴标签
plt.ylabel('sin(x)') # 添加y轴标签
plt.legend(['sin(x)']) # 添加图例(如果有多条曲线,图例会很有用)
plt.grid(True) # 添加网格线
2.5 保存和显示图表
可以使用plt.savefig()将图表保存为文件,或者使用plt.show()在屏幕上显示它。
当然,也可以在程序运行之后,在工具栏点击保存按钮保存图形。
# 保存图表为文件
plt.savefig('sine_wave.png')
# 显示图表
plt.show()
2.6 完整示例
下面是一个完整的示例,它结合了上述所有步骤:
当运行这个示例时,会生成一个名为sine_wave.png的文件,并在屏幕上显示一个正弦波图表。
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y = np.sin(x)
# 绘制数据
plt.plot(x, y)
# 自定义图表
plt.title('Sine Wave')
plt.xlabel('x values')
plt.ylabel('sin(x)')
plt.legend(['sin(x)'])
plt.grid(True)
# 保存和显示图表
plt.savefig('sine_wave.png')
plt.show()
注意:
如果在Jupyter Notebook中工作,plt.show()通常是可选的,因为图表会自动显示。
可以通过传递不同的参数给plt.plot()
、plt.scatter()
等函数来自定义线条样式、标记类型、颜色等。
Matplotlib的文档非常详尽,提供了关于如何自定义图表外观的更多信息。
运行结果如下:
3 拓展应用
3.1 双轴图形
功能:在一个图上同时绘制两个坐标轴(y轴)。
示例代码如下:
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x) # 第一条曲线的数据
y2 = np.cos(x) # 第二条曲线的数据,将绘制在第二个y轴上
# 创建图形和第一个坐标轴
fig, ax1 = plt.subplots()
# 在第一个坐标轴上绘制第一条曲线
color = 'tab:blue'
ax1.set_xlabel('x values')
ax1.set_ylabel('sin(x)', color=color)
ax1.plot(x, y1, color=color, label='sin(x)')
ax1.tick_params(axis='y', labelcolor=color)
# 创建第二个y轴,共享相同的x轴
ax2 = ax1.twinx()
# 在第二个坐标轴上绘制第二条曲线
color = 'tab:red'
ax2.set_ylabel('cos(x)', color=color)
ax2.plot(x, y2, color=color, label='cos(x)')
ax2.tick_params(axis='y', labelcolor=color)
# 添加图例,注意要指定哪个坐标轴的图例
fig.legend(loc="upper left", bbox_to_anchor=(0.1, 0.9))
# 显示图表
plt.title('Sine and Cosine Waves')
plt.grid(True)
plt.show()
运行结果如下:
3.2 曲线描点
功能:把曲线上每一个点都描出来。
示例代码如下:
import matplotlib.pyplot as plt
import numpy as np
# 准备数据
x = np.linspace(0, 10, 100)
y1 = np.sin(x) # 第一条曲线的数据
y2 = np.cos(x) # 第二条曲线的数据,将绘制在第二个y轴上
# 创建图形和第一个坐标轴
fig, ax1 = plt.subplots()
# 在第一个坐标轴上绘制第一条曲线并描点
color = 'tab:blue'
ax1.set_xlabel('x values')
ax1.set_ylabel('sin(x)', color=color)
ax1.plot(x, y1, color=color, label='sin(x)', marker='o') # 添加marker='o'来描点(使用圆点标记)
ax1.tick_params(axis='y', labelcolor=color)
# 创建第二个y轴,共享相同的x轴
ax2 = ax1.twinx()
# 在第二个坐标轴上绘制第二条曲线并描点
color = 'tab:red'
ax2.set_ylabel('cos(x)', color=color)
ax2.plot(x, y2, color=color, label='cos(x)', marker='s') # 添加marker='s'来描点(使用方块标记)
ax2.tick_params(axis='y', labelcolor=color)
# 添加图例
fig.legend(loc="upper left", bbox_to_anchor=(0.1, 0.9))
# 显示图表
plt.title('Sine and Cosine Waves with Markers')
plt.grid(True)
plt.show()
运行结果如下:
3.3 动态曲线
功能:利用Tkinter库与Matplotlib库结合,可以创建一个独立的窗口来显示动态图形。
示例代码如下:
import numpy as np
import matplotlib
matplotlib.use('TkAgg') # 设置Matplotlib后端为TkAgg
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import tkinter as tk
from matplotlib.animation import FuncAnimation
# 准备数据
import numpy as np
import matplotlib
matplotlib.use('TkAgg') # 设置Matplotlib后端为TkAgg
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import tkinter as tk
# 准备数据
x_vals = np.linspace(0, 2 * np.pi, 100)
# 创建Tkinter窗口
root = tk.Tk()
root.wm_title("Dynamic Sine Wave with Tkinter")
# 创建Matplotlib图形
fig, ax = plt.subplots()
line, = ax.plot([], [], lw=2, label='Sine Wave') # 添加标签到线条
ax.set_xlim(0, 2 * np.pi)
ax.set_ylim(-1.5, 1.5)
ax.set_xlabel('x-axis') # x轴标签
ax.set_ylabel('y-axis') # y轴标签
ax.grid(True)
ax.legend() # 显示图例
# 将Matplotlib图形嵌入Tkinter窗口
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=1)
# 初始化函数
def init():
line.set_data([], [])
return line,
# 更新函数
def update(frame):
y_vals = np.sin(x_vals + frame / 10.0)
line.set_data(x_vals, y_vals)
return line,
# 创建动画
ani = FuncAnimation(fig, update, frames=np.arange(0, 200), init_func=init, blit=True, interval=50)
# 运行Tkinter主循环
root.mainloop()
运行结果如下:
作者:柒壹漆