【问题标题】:How to get X-coordinate of Path depending on the Y-coordinate when X-coordinate values are unknown using python当使用python未知X坐标值时,如何根据Y坐标获取路径的X坐标
【发布时间】:2018-05-12 21:58:44
【问题描述】:

当我只有一个已知的 Y 坐标方程,即 P = a * b(其中 a 和 b 的定义值为 0.8,150)且 x 坐标完全未知时,如何在曲线图上得到一个点,并且没有连接 x 和 y 的方程(例如:y = mx +b; # 我没有这种方程)。所以,现在的目标是假设我的“Y 坐标”值为 120,并且需要通过从未知的“x 坐标”值获取距离或路径来在曲线上绘制一个点。

我尝试了如下代码

One sample figure about how I should plot

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import InterpolatedUnivariateSpline

# given values
y = np.array([0, 38.39, 71.41, 99.66, 123.67, 143.88, 160.61, 174.03, 184.16, 190.8, 193.52])
x = np.array([0, 0.37, 0.74, 1.11, 1.48, 1.85, 2.22, 2.59, 2.96, 3.33, 3.7])
x_val = np.linspace(0,7) #limts on x-axis
a = 0.8
b = 150
y_val = np.multiply(a, b)
yinterp = np.interp(x_val, x, y)
plt.plot(x, y, '-')
plt.plot(x_val, yinterp, 'o')

#here i need to plot a exact point w.r.t to y_val
#and also need to show the distance with a line from the selected x and y coordinates

plt.plot(x_val,y_val, '--') 
plt.show()

【问题讨论】:

  • 我不太确定你想要达到什么目的,但你可能需要使用类似np.interp(y_val, y, x) 的东西。
  • @kazemakase 感谢您的回复,我的目标是当我知道 y 截距(0,120)但我不知道 x 截距值时在曲线上绘制一个点。现在我需要使用 y 截距找到 x 截距点。您还可以看到附加的图像。
  • 我不知道什么是截距(在这种情况下),但我上面评论中的代码返回对应于y_val 的插值 x,这似乎是你所追求的。 .
  • 是的,您在评论中编写的代码正在运行,但我的目标是仅在曲线 w.r.t 上获得一个点。 Y 值,在我的情况下,y 截距值被视为(0,y_val)。我只需要使用 y_value 在 x 轴上绘制一个点

标签: python numpy matplotlib scipy


【解决方案1】:

你想要的是找到一个数组的根或零。这个问题的答案显示了如何做到这一点:How to get values from a graph?

将解决方案应用于此案例如下所示:

import matplotlib.pyplot as plt
import numpy as np

# given values
y = np.array([0, 38.39, 71.41, 99.66, 123.67, 143.88, 160.61, 174.03, 184.16, 190.8, 193.52])
x = np.array([0, 0.37, 0.74, 1.11, 1.48, 1.85, 2.22, 2.59, 2.96, 3.33, 3.7])
x_val = np.linspace(0,7) 

plt.plot(x, y, '-')

def find_roots(x,y):
    s = np.abs(np.diff(np.sign(y))).astype(bool)
    return x[:-1][s] + np.diff(x)[s]/(np.abs(y[1:][s]/y[:-1][s])+1)

a = 0.8
b = 150
y_val = np.multiply(a, b)

roots = find_roots(x, y-y_val)
plt.plot(roots[0],y_val, marker="o") 
plt.plot([roots[0],roots[0],0],[0,y_val,y_val], "--")

plt.xlim(0,None)
plt.ylim(0,None)
plt.show()

如果数组是单调递增的,你当然也可以简单地插值:

import matplotlib.pyplot as plt
import numpy as np

# given values
y = np.array([0, 38.39, 71.41, 99.66, 123.67, 143.88, 160.61, 174.03, 184.16, 190.8, 193.52])
x = np.array([0, 0.37, 0.74, 1.11, 1.48, 1.85, 2.22, 2.59, 2.96, 3.33, 3.7])
x_val = np.linspace(0,7) 

plt.plot(x, y, '-')

a = 0.8
b = 150
y_val = np.multiply(a, b)

root = np.interp(y_val,y,x)
plt.plot(root,y_val, marker="o") 
plt.plot([root,root,0],[0,y_val,y_val], "--")

plt.xlim(0,None)
plt.ylim(0,None)
plt.show()

【讨论】:

  • 非常感谢,这正是我所需要的,我想知道为此我可以将 x,y 点作为 csv 文件而不是输入所有点。
  • 是的,这肯定是可能的。
  • 对于同一个问题,如果我有一个 CSV 文件附加到问题中,我可以知道如何绘制,其中有 3 列 x 和 y 列用于绘制线和 z 列用于将 x 和 y 列分组以获得多行。
  • 我成功地应用了 csv 文件,但是当给出 x_val 但 y_val 未知时,我需要帮助来找到根,与上述情况相反,我可以知道我需要在下面的等式中更改哪些因素吗我需要将 x 与 y 互换: s = np.abs(np.diff(np.sign(y))).astype(bool) return x[:-1][s] + np.diff(x)[ s]/(np.abs(y[1:][s]/y[:-1][s])+1
  • 所以,首先,对于这个简单的案例,我的解决方案可能有点过于复杂,所以我更新了答案。为了做相反的事情,你只需改变 y 和 x 的角色。
猜你喜欢
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
相关资源
最近更新 更多