如何从matplotlib中的分类网格点绘制多边形? (阶段形式生成)

问题描述 投票:0回答:1

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()

但是,我想要的是一个具有清晰线性边界的相图,看起来像这样: enter image description hereenter image description here 有什么方法可以使用

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)
python python-3.x pandas matplotlib plot
1个回答
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.