You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()

关键改动说明

  1. 添加平移参数输入:新增dx(X轴平移量)和dy(Y轴平移量)的输入,用户可通过正负值控制平移方向。
  2. 函数平移逻辑:所有函数遵循统一平移变换公式:
    • 沿X轴平移dx:将原函数中的x替换为x - dx(右移为正,左移为负)
    • 沿Y轴平移dy:在原函数结果基础上加上dy(上移为正,下移为负)
  3. 奇点处理:针对双曲线(选项3、6),用np.where避开x=dx时的除以0错误,保证图形正常显示。
  4. 统一显示逻辑:将plt.show()移到所有函数计算完成后,避免重复调用,简化代码结构。
  5. 界面优化:将提示文字改为中文,提升易用性。

内容的提问来源于stack exchange,提问作者Ppepe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:08:21