Ala*_*rik 6 python plot matplotlib
我有一个由 x、y 和 z 列给出的非均匀间隔数据点的 Pandas DataFrame,其中 x 和 y 是变量对,z 是因变量。例如:
import matplotlib.pyplot as plt
from matploblib.mlab import griddata
import numpy as np
import pandas as pd
df = pd.DataFrame({'x':[0, 0, 1, 1, 3, 3, 3, 4, 4, 4],
'y':[0, 1, 0, 1, 0.2, 0.7, 1.4, 0.2, 1.4, 2],
'z':[50, 40, 40, 30, 30, 30, 20, 20, 20, 10]})
x = df['x']
y = df['y']
z = df['z']
Run Code Online (Sandbox Code Playgroud)
我想在 x 和 y 上绘制因变量 z 的等高线图。为此,我创建了一个新网格来使用 matplotlib.mlab 的 griddata 函数对数据进行插值。
xi = np.linspace(x.min(), x.max(), 100)
yi = np.linspace(y.min(), y.max(), 100)
z_grid = griddata(x, y, z, xi, yi, interp='linear')
plt.contourf(xi, yi, z_grid, 15)
plt.scatter(x, y, color='k') # The original data points
plt.show()
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但输出不是我想要的。我不希望 griddata 在 x 和 y 数据的最小值和最大值给出的边界之外进行插值。以下图是调用 plt.show() 后显示的图,然后以紫色突出显示我想要插值和绘制轮廓的数据区域。紫色线外的轮廓应该是空白的。我怎么能去屏蔽外围数据?
不幸的是,链接的问题没有回答我的问题,因为我没有明确的数学方法来定义进行三角剖分的条件。是否可以单独根据数据定义一个条件来屏蔽数据,以上面的Dataframe为例?
正如在这个问题的答案中所见,可能会引入一个条件来掩盖这些值。
问题中的句子 “我不希望 griddata 在 x 和 y 数据的最小值和最大值给定的边界之外进行插值。” 意味着存在一些可以使用的最小/最大条件。
如果不是这种情况,可以使用路径裁剪轮廓。需要指定这条路径的点,因为没有通用的方法来知道哪些点应该是边缘。下面的代码针对三种不同的可能路径执行此操作。
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
from matplotlib.mlab import griddata
import numpy as np
import pandas as pd
df = pd.DataFrame({'x':[0, 0, 1, 1, 3, 3, 3, 4, 4, 4],
'y':[0, 1, 0, 1, 0.2, 0.7, 1.4, 0.2, 1.4, 2],
'z':[50, 40, 40, 30, 30, 30, 20, 20, 20, 10]})
x = df['x']
y = df['y']
z = df['z']
xi = np.linspace(x.min(), x.max(), 100)
yi = np.linspace(y.min(), y.max(), 100)
z_grid = griddata(x, y, z, xi, yi, interp='linear')
clipindex = [ [0,2,4,7,8,9,6,3,1,0],
[0,2,4,7,5,8,9,6,3,1,0],
[0,2,4,7,8,9,6,5,3,1,0]]
fig, axes = plt.subplots(ncols=3, sharey=True)
for i, ax in enumerate(axes):
cont = ax.contourf(xi, yi, z_grid, 15)
ax.scatter(x, y, color='k') # The original data points
ax.plot(x[clipindex[i]], y[clipindex[i]], color="crimson")
clippath = Path(np.c_[x[clipindex[i]], y[clipindex[i]]])
patch = PathPatch(clippath, facecolor='none')
ax.add_patch(patch)
for c in cont.collections:
c.set_clip_path(patch)
plt.show()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3062 次 |
| 最近记录: |