繁体   English   中英

在 matplotlib plot 中绘制垂直于 X 轴和 Y 轴的线到曲线

[英]Draw lines perpendicular to X axis and Y axis to a curve in matplotlib plot

我正在尝试 plot 从 Y 轴上的选定点(例如,y = 150,在我们的以下示例数据中)到曲线(我们的示例 plot 中的蓝色直线)的水平线。 然后,从水平线与曲线的交点,我想放下一条垂直于 X 轴的线。 我尝试了以下代码行,但我无法限制参数xmax的值,以使水平线恰好在与曲线的交点处结束。 我也知道xmax = 1.0的最大限制。 对于这种情况, xmax = 0.5可能会给我交点。 但是,我想在更复杂的曲线上实现这一点。 有人可以给我建议吗?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt


df = pd.DataFrame({'x': np.arange(10),
                   'y': np.arange(100, 200, 10)})

fig,ax = plt.subplots(figsize =(4.5,4.5))
ax.plot(df.x,df.y)

plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(0,10)
plt.ylim(100,200)

# ax.axhline(y=150, xmin=-0.02, xmax=0.5, clip_on= True)
ax.axhline(y=150, xmin=0, xmax= df.loc[df['y'] == 150, 'x'].iloc[0], clip_on= False, color = 'Green')

plt.show()
plt.clf()

此代码生成以下 plot: 在此处输入图像描述

Plot 我要在此处输入图像描述

李玉鹏的解决方案很棒,这里是使用scipy的interpolate class的解析解决方案:

from scipy.interpolate import interp1d

df = pd.DataFrame({'x': np.arange(10), 'y': np.arange(100, 200, 10)})

f = interp1d(df.y, df.x)
my_y_val = 150
my_x_val = float(f(my_y_val))

fig,ax = plt.subplots(figsize =(4.5,4.5))
ax.plot(df.x,df.y)

plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(0,10)
plt.ylim(100,200)

my_y_max = (my_y_val - ax.get_ylim()[0])/(ax.get_ylim()[1] - ax.get_ylim()[0])
my_x_max = (my_x_val - ax.get_xlim()[0])/(ax.get_xlim()[1] - ax.get_xlim()[0])

ax.axhline(y=my_y_val, xmin=0, xmax=my_x_max, clip_on= False, color='green')
ax.axvline(x=float(my_x_val), ymin=0, ymax=my_y_max, clip_on= False, color='blue')

plt.show()
plt.clf()

在此处输入图像描述

我们根据我们的数据创建一个简单的线性插值 function(在这种情况下反转输入和 output),然后为我们给定的 x 和 Z32FA6E1B78A9D4028953E60564A2AA4 找到适当的值。 请注意, ymax/yminxmax/xmin的值是轴的一部分,而不是 x 轴和 y 轴上的值,因此我们需要计算它们,允许轴不从 0 开始(如是其中之一的情况)。

当然,您不需要库来实现直线插值,但您可以根据需要交换二次、线性、样条等

我遵循这个,代码在这里。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

from shapely.geometry import LineString

df = pd.DataFrame({'x': np.arange(10),
                   'y': np.arange(100, 200, 10)})

fig,ax = plt.subplots(figsize =(4.5,4.5))
ax.plot(df.x,df.y)

plt.xlabel('X')
plt.ylabel('Y')
plt.xlim(0,10)
plt.ylim(100,200)

ypoint = 140

### copy curve line y coords and set to a constant
lines = df.y.copy()
lines[:] = ypoint

#get intersection 
first_line = LineString(np.column_stack((df.x, df.y)))
second_line = LineString(np.column_stack((df.x, lines)))
intersection = first_line.intersection(second_line)
ax.plot(*intersection.xy, 'o')

# plot hline and vline
ax.hlines(y=ypoint, xmin=0, xmax= intersection.x, clip_on= True, color = 'Green')
ax.vlines(x=intersection.x, ymin=100, ymax= intersection.y, clip_on= True, color = 'Green')

plt.show()

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM