3 votes

Colorier des données conditionnelles sur un graphique avec matplotlib en lançant une boucle

J'ai le cadre de données suivant

import pandas as pd
import matplotlib.pyplot as plt

datas = [['RAC1','CD0287',1.52,9.88], ['RAC1','CD0695',2.08,10.05],['RAC1','CD0845',2.01,10.2], ['RAC3','CD0258',1.91,9.8], ['RAC3','CD471',1.66,9.6], ['RAC8','CD0558',1.32,9.3], ['RAC8','CD0968',2.89,10.01]]
labels = ['Plate', 'Sample', 'LogRatio', 'Strength']
df = pd.DataFrame(data = datas, columns=labels, index=[8, 3, 5, 4, 12, 44, 2])
print(df)

    Plate  Sample  LogRatio  Strength
8   RAC1  CD0287      1.52      9.88
3   RAC1  CD0695      2.08     10.05
5   RAC1  CD0845      2.01     10.20
4   RAC3  CD0258      1.91      9.80
12  RAC3   CD471      1.66      9.60
44  RAC8  CD0558      1.32      9.30
2   RAC8  CD0968      2.89     10.01

Comme vous pouvez le voir, mes données sont réparties sur différentes plaques. Je voudrais créer autant de graphiques que j'ai de plaques différentes : 3 graphiques. Et sur chaque parcelle, je voudrais colorer une plaque en rouge et les autres en noir.

Le seul moyen que j'ai trouvé jusqu'à présent, est de le faire manuellement en écrivant le code pour chaque plaque, et de changer la plaque rouge pour l'exécution de la recherche (j'ai plus de 30 plaques en réalité donc cela prend trop de temps). Je peux toujours vous montrer mon code si cela peut vous aider à comprendre :

def getIndexPlates(df):
    listIndicesAllPlates = []
    df = df.reset_index()
    for name,group in df.groupby("Plate"): 
        temp_list = []
        temp_list.append(name)
        temp_list.append(group.index.tolist()) #create a tuple with the name of the plate and the index of all the samples in this plate
        listIndexAllPlates.append(temp_list)
    return listIndexAllPlates

def plotting(df,listIndexAllPlates): 
    plt.clf()
    ax=plt.gca()
    datas = df[["LogRatio", "Strength"]].as_matrix()
    for sample in range(len(datas)):
        if sample in listIndexAllPlates[0][1]: #if the sample is on the the first tuple of my list -> on the first plate
            ax.scatter(datas[sample,0], datas[sample,1], alpha=0.8, facecolors='none', edgecolors='red')
        if sample in listIndexAllPlates[1][1]:
            ax.scatter(datas[sample,0], datas[sample,1], alpha=0.8, facecolors='none', edgecolors='black')
        if sample in listIndexAllPlates[2][1]:
            ax.scatter(datas[sample,0], datas[sample,1], alpha=0.8, facecolors='none', edgecolors='black')
    plt.show()

listIndexAllPlates = getIndexPlates(df)
plotting(df,listIndexAllPlates)

enter image description here J'ai donc ici mon premier tracé avec la plaque 'RAC1' en rouge et RAC3 et RAC8 en noir, et maintenant je voudrais avoir le deuxième tracé avec RAC3 en rouge (RAC1 et RAC8 en noir) et le troisième tracé avec RAC8 en rouge (RAC1 et RAC3 en noir). Pour ce faire, je change manuellement la couleur dans ma fonction, mais j'aimerais trouver une solution pour le faire automatiquement. Et je sais que ma méthode est vraiment mauvaise et laide, mais je ne sais pas comment faire.

4voto

pansen Points 3249

Vous pouvez utiliser groupby ici en conjonction avec difference de l'objet Index de pandas pour parcourir en boucle vos plaques et obtenir les indices pour les actuel l'assiette et les autres :

for label, plate_df in df.groupby("Plate"):
    plate_indices = plate_df.index
    rest_indices = df.index.difference(plate_indices)

    # do your plotting here accordingly

    print(label, plate_indices, rest_indices)

RAC1 Int64Index([8, 3, 5], dtype='int64') Int64Index([2, 4, 12, 44], dtype='int64')
RAC3 Int64Index([4, 12], dtype='int64') Int64Index([2, 3, 5, 8, 44], dtype='int64')
RAC8 Int64Index([44, 2], dtype='int64') Int64Index([3, 4, 5, 8, 12], dtype='int64')

Modifier

Pour inclure le traçage, il suffit d'inclure vos instructions matplotlib :

plot_kwargs = {"alpha": 0.8, "facecolors": "none"}
for label, plate_df in df.groupby("Plate"):
    plate_indices = plate_df.index
    rest_indices = df.index.difference(plate_indices)

    # create plot
    plt.clf()
    ax=plt.gca()
    ax.scatter(df.loc[plate_indices, "LogRatio"], df.loc[plate_indices, "Strength"], edgecolors='red', **plot_kwargs)
    ax.scatter(df.loc[rest_indices, "LogRatio"], df.loc[rest_indices, "Strength"], edgecolors='black', **plot_kwargs)
    plt.show()

enter image description here enter image description here enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X