如何在Matplotlib中实现函数图沿X/Y轴平滑平移并保留原图
问题描述
我有一段使用Matplotlib和NumPy绘制多种函数(直线、抛物线、双曲线等)的代码,希望实现图形能根据用户输入的坐标沿X轴和Y轴平滑平移,同时保留现有所有函数图的样式与功能,但不清楚具体实现方法。原代码如下:
import matplotlib.pyplot as plt import numpy as np print('''Available options: 1) straight line 2) Parabola 3) Hyperbole 4) Cubic parabola 5) Parabola branches down 6) Negative hyperbole 7) Sinusoid 8) Cosine''') a = int(input("Select the function graph: ")) fig, ax = plt.subplots() ax.set_xlabel('x') ax.set_ylabel('y') f = int(input("Введите x: ")) if f < 0: x = np.linspace(f, abs(f), 100) else: print("x Нужно вводить отрицательный") ax = plt.gca() ax.spines['left'].set_position('center') ax.spines['bottom'].set_position('center') ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) match a: case 1: y = x + 3 ax.plot(x, y) plt.show() case 2: y = x**2 ax.plot(x, y) plt.show() case 3: y = 1 / x ax.plot(x, y) plt.show() case 4: y = x**3 + 2*x + 2 ax.plot(x, y) plt.show() case 5: y = -(x**2) ax.plot(x, y) plt.show() case 6: y = -(1 / x) ax.plot(x, y) plt.show() case 7: y = np.sin(x) ax.plot(x, y) plt.show() case 8: y = np.cos(x) ax.plot(x, y) plt.show() case _: print("You have entered a non-existent value")
解决方案
要实现图形平移,核心是对函数的输入输出做坐标变换,同时保留原有样式。以下是修改后的完整代码及关键改动说明:
修改后的代码
import matplotlib.pyplot as plt import numpy as np # 显示可选函数列表 print('''可选函数: 1) 直线 2) 抛物线 3) 双曲线 4) 三次抛物线 5) 开口向下的抛物线 6) 负双曲线 7) 正弦曲线 8) 余弦曲线''') func_choice = int(input("选择要绘制的函数:")) # 获取用户输入的平移参数 dx = float(input("输入X轴平移量(正数右移,负数左移):")) dy = float(input("输入Y轴平移量(正数上移,负数下移):")) # 设置画布和坐标轴 fig, ax = plt.subplots() ax.set_xlabel('x') ax.set_ylabel('y') # 获取x轴范围输入 x_range = int(input("输入x轴左边界(需为负数):")) if x_range < 0: x = np.linspace(x_range, abs(x_range), 100) else: print("x轴左边界必须输入负数") exit() # 保持原有坐标轴样式 ax.spines['left'].set_position('center') ax.spines['bottom'].set_position('center') ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) # 根据选择计算平移后的函数 match func_choice: case 1: # 原函数y = x + 3,平移后y = (x - dx) + 3 + dy y = (x - dx) + 3 + dy case 2: # 原函数y = x²,平移后y = (x - dx)² + dy y = (x - dx)**2 + dy case 3: # 原函数y = 1/x,平移后y = 1/(x - dx) + dy,处理奇点避免除以0 y = np.where(x != dx, 1/(x - dx), np.nan) case 4: # 原函数y = x³ + 2x + 2,平移后y = (x - dx)³ + 2*(x - dx) + 2 + dy y = (x - dx)**3 + 2*(x - dx) + 2 + dy case 5: # 原函数y = -x²,平移后y = -(x - dx)² + dy y = -(x - dx)**2 + dy case 6: # 原函数y = -1/x,平移后y = -1/(x - dx) + dy,处理奇点避免除以0 y = np.where(x != dx, -1/(x - dx), np.nan) case 7: # 原函数y = sin(x),平移后y = sin(x - dx) + dy y = np.sin(x - dx) + dy case 8: # 原函数y = cos(x),平移后y = cos(x - dx) + dy y = np.cos(x - dx) + dy case _: print("输入的选项不存在") exit() # 绘制图形并显示 ax.plot(x, y) plt.show()
关键改动说明
- 添加平移参数输入:新增
dx(X轴平移量)和dy(Y轴平移量)的输入,用户可通过正负值控制平移方向。 - 函数平移逻辑:所有函数遵循统一平移变换公式:
- 沿X轴平移
dx:将原函数中的x替换为x - dx(右移为正,左移为负) - 沿Y轴平移
dy:在原函数结果基础上加上dy(上移为正,下移为负)
- 沿X轴平移
- 奇点处理:针对双曲线(选项3、6),用
np.where避开x=dx时的除以0错误,保证图形正常显示。 - 统一显示逻辑:将
plt.show()移到所有函数计算完成后,避免重复调用,简化代码结构。 - 界面优化:将提示文字改为中文,提升易用性。
内容的提问来源于stack exchange,提问作者Ppepe
相关产品推荐
相关产品推荐

