I有一个数据框,其中包含1681个均匀分布的2D网格点。每个数据点都有其X和Y坐标,一个代表其类别(或阶段)的标签以及该类别的颜色。
x y label color
0 -40.0 -30.0 Fe #660066
1 -40.0 -29.0 Fe #660066
2 -40.0 -28.0 FeS #ff7f50
3 -40.0 -27.0 FeS #ff7f50
4 -40.0 -26.0 FeS #ff7f50
... ... ... ... ...
1676 0.0 6.0 Fe2(SO4)3 #8a2be2
1677 0.0 7.0 Fe2(SO4)3 #8a2be2
1678 0.0 8.0 Fe2(SO4)3 #8a2be2
1679 0.0 9.0 Fe2(SO4)3 #8a2be2
1680 0.0 10.0 Fe2(SO4)3 #8a2be2
[1681 rows x 4 columns]
我想生成一个多边形图,该图显示了每个类别的线性边界(在我的情况下,也称为“相图”)。 sor远,我只能在这样的简单散点图中显示这种图:
import matplotlib.pyplot as plt
import pandas as pd
plt.figure(figsize=(8., 8.))
for color in df.color.unique():
df_color = df[df.color==color]
plt.scatter(
x=df_color.x,
y=df_color.y,
c=color,
s=100,
label=df_color.label.iloc[0]
)
plt.xlim([-40., 0.])
plt.ylim([-30., 10.])
plt.xlabel('Log pO2(g)')
plt.ylabel('Log pSO2(g)')
plt.legend(bbox_to_anchor=(1.05, 1.))
plt.show()
但是,我想要的是一个具有清晰线性边界的相图,看起来像这样:
有什么方法可以使用
matplotlib
来生成此类相图?请注意,我希望边界线始终位于两个相邻点的中间。我想需要某种线条拟合,并且在这里可能很有用。
对于简单的测试,我附上了用于生成数据的代码片段,但是下面显示的多边形信息不应用于生成相图
matplotlib.patches.Polygon
我不确定您是否可以轻松地获得连续多边形的表示,但是您可以轻松地使用
import numpy as np
import pandas as pd
from shapely.geometry import Point, Polygon
labels = ['Fe', 'Fe3O4', 'FeS', 'Fe2O3', 'FeS2', 'FeSO4', 'Fe2(SO4)3']
colors = ['#660066', '#b6fcd5', '#ff7f50', '#ffb6c1', '#c6e2ff', '#d3ffce', '#8a2be2']
polygons = []
polygons.append(Polygon([(-26.7243,-14.7423), (-26.7243,-30.0000), (-40.0000,-30.0000),
(-40.0000,-28.0181)]))
polygons.append(Polygon([(-18.1347,-0.4263), (-16.6048,1.6135), (-16.6048,-30.0000),
(-26.7243,-30.0000), (-26.7243,-14.7423), (-18.1347,-0.4263)]))
polygons.append(Polygon([(-18.1347,-0.4263), (-26.7243,-14.7423),
(-40.0000,-28.0181), (-40.0000,-22.2917), (-18.1347,-0.4263)]))
polygons.append(Polygon([(0.0000,-20.2615), (0.0000,-30.0000), (-16.6048,-30.0000),
(-16.6048,1.6135), (-16.5517,1.6865), (-6.0517,-0.9385), (0.0000,-3.9643)]))
polygons.append(Polygon([(-14.2390,10.0000), (-14.5829,7.5927), (-16.5517,1.6865),
(-16.6048,1.6135), (-18.1347,-0.4263), (-40.0000,-22.2917), (-40.0000,10.0000)]))
polygons.append(Polygon([(-6.0517,-0.9385), (-16.5517,1.6865), (-14.5829,7.5927),
(-6.0517,-0.9385)]))
polygons.append(Polygon([(0.0000,-3.9643), (-6.0517,-0.9385), (-14.5829,7.5927),
(-14.2390,10.0000), (0.0000,10.0000)]))
x_grid = np.arange(-40., 0.01, 1.)
y_grid = np.arange(-30., 10.01, 1.)
xy_grid = np.array(np.meshgrid(x_grid, y_grid)).T.reshape(-1, 2).tolist()
data = []
for coords in xy_grid:
point = Point(coords)
for i, poly in enumerate(polygons):
if poly.buffer(1e-3).contains(point):
data.append({
'x': point.x,
'y': point.y,
'label': labels[i],
'color': colors[i]
})
break
df = pd.DataFrame(data)
: