Python 编程和分组依据

Python programming and group by

我已经很长了table,这里有一个例子:

而我想要的是根据图像编号绘制。在图上以 1、2、3 和散点 x y(在第 2 列和第 3 列中给出)坐标给出。颜色应根据类型,例如 Green 表示 P,红色表示 F 等等。

此外,我希望它们单独绘制而不是在图表中并像 image.1 image2 和 image 3 一样保存它们。

请提出可能的解决方案。

我做了分组,现在卡在这里了。

我到目前为止所做的如下:

for index, group in data.groupby(['image number']):
    
    group.plot(x='x',y='y', label=index, kind='scatter')

请帮我根据MP列在绘图中添加颜色。

据我了解,您的 dataframe 看起来像这样:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

df = pd.DataFrame([
    {"number": 1, "x": 2391, "y": 1994, "MP": "PP"},
    {"number": 1, "x": 530, "y": 2707, "MP": "PP"},
    {"number": 1, "x": 467, "y": 3208, "MP": "PP"},
    {"number": 2, "x": 952, "y": 656, "MP": "PE"},
    {"number": 2, "x": 3678, "y": 1409, "MP": "PE"},
    {"number": 3, "x": 2950, "y": 177, "MP": "PMMA"},
    {"number": 3, "x": 1039, "y": 306, "MP": "f"},
    {"number": 3, "x": 2726, "y": 1827, "MP": "PMMA"},
    {"number": 3, "x": 3578, "y": 2129, "MP": "PMMA"},
    {"number": 3, "x": 3708, "y": 3624, "MP": "f"},
    # rest of dataframe entries...
    ])

如果您想使用 matplotlib 绘制这些粒子的散点图,您只需遍历数据框并使用 plt.scatter 绘制单个粒子,如下所示:

scheme = {
    "PP": "m", # PP is magenta
    "PE": "g", # PE is green
    "PMMA": "c", # PMMA is cyan
    "f": "r", # f is red
    # put more colours here...
    }

def plot_single(df, num, scheme):
    for i in range(len(df.index)):
        if df["number"][i] == num:
            plt.scatter(x=df["x"][i], y=df["y"][i], c = scheme[df["MP"][i]] if df["MP"][i] in scheme else "k")
    # V change these as needed V
    plt.title("Particle "+str(num))
    plt.xlabel("x")
    plt.ylabel("y")
    # ^ change these as needed ^
    plt.show()

例如,如果您使用 dataframe 的小片段尝试 plot_single(df, 1, scheme),您将得到此图:

要进一步自定义散点图,您可以添加 legend, change the colour scheme, tinker with the scatter plot

编辑:

如果你想把所有的散点图都放在一张图上,你可以用这样的函数来实现:

def plot_all(df, scheme):
    for i in range(len(df.index)):
        plt.scatter(x=df["x"][i], y=df["y"][i], c = scheme[df["MP"][i]] if df["MP"][i] in scheme else "k")
    plt.title("All Particles")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.show()

您可以通过在 shell 中输入 plot_all(df, scheme) 来调用它。