Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:解释熊猫绘制的线条(可能的插值)_Python_Python 3.x_Pandas_Dataframe_Plot - Fatal编程技术网

Python:解释熊猫绘制的线条(可能的插值)

Python:解释熊猫绘制的线条(可能的插值),python,python-3.x,pandas,dataframe,plot,Python,Python 3.x,Pandas,Dataframe,Plot,我正在处理这个数据帧: 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.

我正在处理这个数据帧:

    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)

我曾考虑过在更近的直线之间使用插值,但我真的不知道如何做到这一点。我在论坛上搜索过类似的案例,但什么也没找到


感谢您的帮助:)

您似乎希望能够同时插值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
也可以更正确地进行这种类型的插值。从原始数据帧重新开始:

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

红色点的坐标是
(8,3.8)
我不清楚您想要得到点的Y轴值(这里是3.8),如果用户决定以X轴值和“B_值”作为输入绘制点(对于我们的示例,它可以是X=8和B=90,但如果未绘制给定的“B_值”,我也希望能够这样做:)谢谢,我正在尝试:)s变量是什么?@AlexJJ对不起,那应该是
s=df.stack()
我在sp[45,7]上得到一个错误:索引器错误:只有整数、片(
)、省略号(
)、numpy.newaxis(
)整数或布尔数组是有效的指示符只有在输入浮点时才会出现此错误(例如:sp[45,7.5]@AlexJJ是的,
sp
是一个数组,因此您只能通过整数对其进行索引。如果您想要更细的间距,您需要在
np.meshgrid
步骤中修改间距。但是要选择X=12,您需要更加小心,因为索引
12
不会对应于X=12(即,如果间距为0.5,则需要选择索引24)