【问题标题】:matplotlib doesn't display the correct datamatplotlib 不显示正确的数据
【发布时间】:2021-10-08 12:43:00
【问题描述】:

我是 Python 新手。出于某种原因,当我查看绘图时,它显示所有数据,好像Y = 0 但最后一个数据,这很奇怪,因为当我要求它打印Y 它显示正确的值。我做错了什么?

import math
import numpy as np
import matplotlib.pyplot as plt

y0=2 # [m]
g=9.81 # [m/s^2]
v=20 # initial speed [m/s]
y_target=1 # [m]
x=35 # [m]
n_iter=50
theta=np.linspace(0,0.5*math.pi,n_iter) # theta input [rad]
Y=np.zeros(n_iter) # y output [m]
for i in range(n_iter):
    Y[i]=math.tan(theta[i])*x-g/(2*(v*math.cos(theta[i]))**2)*x**2+y0

plt.plot(theta,Y)
plt.ylabel('y [m]')
plt.xlabel('theta [rad]')
plt.ylim(top=max(Y),bottom=min(Y))
plt.show()

【问题讨论】:

  • 它没有设置 Y=0。最后一个值是更大的负值,尝试plt.plot(theta[:-2],Y[:-2])(不设置plt.ylim)以更详细地查看您的情节。
  • 设置plt.yscale('symlog'):Code and Plot

标签: python numpy matplotlib


【解决方案1】:

问题在于,当theta 接近 π/2 时,该函数有点崩溃。注意图中 y 轴顶部的小 1e33:该轴的比例很大,因为 y 的最后一个值基本上是负无穷大(因为几乎被零除)。如果您更改 y 轴的限制,例如到 (-1000, +1000),情节看起来是正确的。

但我忍不住要帮助你解决一些你没有寻求帮助的事情……你没有正确使用 NumPy。 NumPy 为您提供了两件事:作为数据结构的 n 维数组,以及使用这些数组进行“矢量化”计算的快速优化代码。本质上,您从不需要 NumPy 中的循环 - 您只需一次计算所有内容。试试10 * np.array([1, 2, 3]),你就会明白了。

所以我会这样写你的代码:

import numpy as np
import matplotlib.pyplot as plt

# Problem parameters.
y0 = 2       # [m]
g = 9.81     # [m/s^2]
v = 20       # initial speed [m/s]
x = 35       # [m]

# Make theta [rad].
steps = 50
theta = np.linspace(0, 0.5*np.pi, steps)

# Compute y.
y = np.tan(theta) * x - g / (2 * (v * np.cos(theta))**2) * x**2 + y0

# Plot.
plt.plot(theta, y)
plt.ylabel('y [m]')
plt.xlabel('theta [rad]')
plt.ylim(-1000, 1000)
plt.show()

请注意,这里没有循环——您只需像使用标量一样使用向量 theta。当您使用 NumPy 时,根本不需要 math 库(它不能处理 NumPy 的数组,只能处理标量)。

【讨论】:

    猜你喜欢
    • 2017-05-30
    • 2021-10-07
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    相关资源
    最近更新 更多