我正在处理此数据框:
0 B 30 B 60 B 90 B
0 0.0 0.80 1.000000 2.0
1 0.5 1.00 1.300000 2.5
3 0.7 1.30 1.700000 3.0
5 0.8 1.50 2.033333 3.5
10 1.0 1.75 2.383333 4.0
13 1.3 1.99 2.733333 4.3
15 1.5 2.23 3.083333 4.5
20 2.0 2.50 3.433333 5.0
25 2.5 3.00 3.783333 5.5
30 3.0 3.30 4.133333 6.0
我用它绘制了以下曲线,其中每一列代表一条线,数据框的索引是x轴,数据框的值是y轴。为此,我仅使用以下简单行:
data.plot()
以下是绘制的曲线:
现在,我正在尝试在此图形上绘制点。如果用户提供x轴的值和“ B值”(例如在图形上,红色点的“ B值”为90),我希望能够绘制该点不是绘制的曲线(例如45)。
我已经考虑过在更近的线之间使用插值,但是我真的不知道该怎么做。我在论坛中搜索了类似的案例,但没有找到任何内容。
感谢您的帮助:)
答案 0 :(得分:1)
似乎您希望能够内插 X值和B值。因此,您当前的表示方式有些混乱。我认为将这些轴设为轴,然后用颜色代表第三维,这是更自然的选择。
如果知道只需要整数值,则可以reindex
在两个轴上进行内插。插值有很多选择。这是一种单独执行每个操作的虚拟方法,只是为了说明其原理。
import matplotlib.pyplot as plt
# Fix column names
df.columns = [int(x[0]) for x in df.columns.str.split()]
df = df.reindex(range(0,max(df.columns)+1), axis=1).reindex(range(0, max(df.index)+1))
df_i = df.interpolate(axis=1).interpolate()
# To get a value (X, B)
df_i.loc[7, 45]
#1.8866665000000002
# For plotting
fig, ax = plt.subplots()
im = ax.pcolormesh(df_i.T)
ax.set_xlabel('X')
ax.set_ylabel("B")
fig.colorbar(im, ax=ax)
plt.show()
使用scipy
也可以更正确地进行这种插值。从原始DataFrame重新开始:
from scipy import interpolate
import numpy as np
df.columns = [int(x[0]) for x in df.columns.str.split()]
# Get arrays for all valid values:
s = df.stack()
x = s.index.get_level_values(0).to_numpy()
y = s.index.get_level_values(1).to_numpy()
z = s.to_numpy()
# Grid on which you want to interpolate data
grid_x, grid_y = np.meshgrid(range(0, max(df.index)+1), range(0, max(df.columns)+1))
# Interpolate
sp = interpolate.griddata(np.array(list(zip(x,y))), z, (grid_x, grid_y), method='linear')
# Same point as above,
sp[45, 7]
#1.9066665000000003