Wie zeichnen Sie Polygone aus kategorialen Gitterpunkten in Matplotlib auf? (Phase-Diagrammerzeugung)Python

Python-Programme
Anonymous
 Wie zeichnen Sie Polygone aus kategorialen Gitterpunkten in Matplotlib auf? (Phase-Diagrammerzeugung)

Post by Anonymous »

Ich habe einen Datenrahmen, der 1681 gleichmäßig verteilte 2D -Gitterpunkte enthält. Jeder Datenpunkt hat seine X- und Y -Koordinaten, eine Etikett, die seine Kategorie (oder Phase) darstellt, und eine Farbe für diese Kategorie. < /P>

Code: Select all

         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]
< /code>
Ich möchte ein Polygondiagramm erstellen, das die lineare Grenze jeder Kategorie zeigt (in meinem Fall auch als "Phasendiagramm" bezeichnet). SOR FAR kann ich diese Art von Diagramm in einem einfachen Streudiagramm wie folgt nur zeigen: < /p>
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()
, was ich jedoch will, ist jedoch Ein Phasendiagramm mit klaren linearen Grenzen, die so aussieht:

Gibt es eine Möglichkeit, ein solches Phasendiagramm mit Matplotlib < /code> zu generieren? Beachten Sie, dass die Grenze nicht deterministisch ist, insbesondere wenn die Netzpunkte nicht dicht genug sind. Daher muss es eine Art Heuristik geben, zum Beispiel sollte die Grenzlinie immer in der Mitte von zwei benachbarten Punkten mit verschiedenen Kategorien liegen. Ich kann mir vorstellen, dass es eine Art Zeilenanpassung oder Interpolation benötigt, und Matplotlib.patches.polygon ist hier wahrscheinlich nützlich. Generieren der Daten, aber Die unten gezeigten Polygoninformationen sollen nicht zum Erzeugen des Phasendiagramms
verwendet werden

Code: Select all

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)

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post