Polygon et contains

Résolu/Fermé
B_Lolita Messages postés 3 Date d'inscription lundi 14 juin 2021 Statut Membre Dernière intervention 13 août 2021 - 11 août 2021 à 16:37
B_Lolita Messages postés 3 Date d'inscription lundi 14 juin 2021 Statut Membre Dernière intervention 13 août 2021 - 13 août 2021 à 14:02
Bonjour,

Je cherche à créer un programme qui associe une couleur à un point en fonction de sa place dans un triangle.
Les points qui ne sont pas dans le triangle sont mis en noir.
Pour cela je crée un Polygon et j'utilise la fonction .contains pour savoir si le point se trouve ou non dedans.
Mon problème est que quand j'utilise le scatter je met l'axe des x en échelle logarithmique et là je me retrouve avec plein de point en noir dans mon triangle.
Si j'enlève l'échelle logarithmique j'ai bien les points noirs à l'extérieur.
Savez-vous s'il existe une méthode ou une variable permettant de préciser dans le ".contains" que l'axe des x sera logarithmique?

Merci bonne journée

#Création du triangle
triangle = Polygon([[mic,mib],[mac,mab],[mac,mib]])
x,y = triangle.exterior.xy

 ##Look if the point are in the triangle
    points = []
    for i in range(len(df)):
        p1=Point(df['chl'].iloc[i],df['nppv'].iloc[i])
        points.append(triangle.contains(p1))
    df['in_out'] =points
    cond1=(df['in_out']==True)
    cond2=(df['in_out']==False) 
    sample_in= pd.DataFrame(df[cond1])
    sample_out= pd.DataFrame(df[cond2])

    #Resolve  the system
    a = np.array ([[mic,mac,mac],[mib,mab,mib],[1,1,1]])

    qr = [] #red coefficient
    qg = [] #green coefficient
    qb = [] #blue coefficient
    for i in range(len(sample_in)):
        b = np.array([sample_in['chl'].iloc[i],sample_in['nppv'].iloc[i],1])
        #This doen't work if it's a singular matrix
        x1 = np.linalg.solve(a,b)
        #So the result can be approch by this
        #x1 = np.linalg.lstsq(a,b)
        qr.append(x1[0])
        qg.append(x1[1])
        qb.append(x1[2])

    sample_in['qr'] = qr
    sample_in['qg'] = qg
    sample_in['qb'] = qb
    list_resu = []
    for i in range(len(sample_in)):
        if is_between(0, qr[i], 1) & is_between(0, qg[i], 1) & is_between(0, qb[i], 1) :
            list_resu.append([qr[i],qg[i],qb[i]])
        else :
            list_resu.append('black')
    
    sample_in['Color']=list_resu
    sample_out['Color'] = 'black'
    all_data = pd.concat([sample_in,sample_out])
   
    ax.plot(x,y)
    ax.scatter(all_data['chl'],all_data['nppv'], c = all_data['Color'])
    plt.title("Diagram chlorophyll/biomass %s ,depth = %i " %(time,d), fontsize = 40)

Ici c'est le triangle sans l'échelle logarithmique.


Et ensuite avec l'échelle logarithmique, l'idéal serait que les points noirs soient en couleur en fonction de leur position dans le triangle


Configuration: Linux / Firefox 90.0

1 réponse

yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 Ambassadeur 1 554
11 août 2021 à 18:03
bonjour,
je pense qu'en ligne 8 et 9, tu dois utiliser le logarithme.
n'as-tu pas oublié de nous communiquer certains imports?
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
11 août 2021 à 18:08
peux-tu partager un programme que nous pouvons tester?
0
B_Lolita Messages postés 3 Date d'inscription lundi 14 juin 2021 Statut Membre Dernière intervention 13 août 2021 > yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024
13 août 2021 à 10:37
Bonjour,
Oui désolé je n'ai pas partagé tout le programme car je ne savais pas si ce serait utile sachant qu'il est assez long et que les données que j'utilise font plusieurs gigas.
J'ai écrit un programme simplifié pour mieux cerner le problème.

import numpy as np
from shapely.geometry import Polygon
from shapely.geometry import Point
import matplotlib.pyplot as plt
from random import uniform

l1 = []
l2 = []
for i in range(1000):
    l2.append( uniform(0, 80) )
    l1.append(uniform(0.001,1))

mac = max(l1)
mab = max(l2)
mic = min(l1)
mib = min(l2)

triangle = Polygon([[mic,mib],[mac,mab],[mac,mib]])
x,y = triangle.exterior.xy

color = []
points = []
for i in range(1000):
    p1=Point(l1[i],l2[i])
    points.append(triangle.contains(p1))
for i in range(1000):
    if points[i] == True:
        color.append('red')
    else:
        color.append('blue')

fig = plt.figure(figsize=(40,15))
ax = plt.gca()
ax.plot(x,y)
ax.scatter(l1,l2, c = color)
ax.set_xscale('log')
plt.title("Avec échelle logarithmique",fontsize =40)

fig = plt.figure(figsize=(40,15))
ax = plt.gca()
ax.plot(x,y)
ax.scatter(l1,l2, c = color)
plt.title("Sans échelle logarithmique",fontsize =40)


Je pense aussi qu'il faut utiliser le logarithme au niveau des lignes 24 et 25 mais je n'ai trouvé aucune information là dessus.
Merci beaucoup
0
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554 > B_Lolita Messages postés 3 Date d'inscription lundi 14 juin 2021 Statut Membre Dernière intervention 13 août 2021
13 août 2021 à 13:42
quelle information cherches-tu?
il suffit de calculer ainsi pour mettre le point au bon endroit par rapport au triangle:
lmic=math.log10(mic)
p=(mac-mic)/(math.log10(mac)-lmic)
for i in range(r):
    p1=Point((math.log10(l1[i])-lmic)*p+mic,l2[i])
    points.append(triangle.contains(p1))
0
B_Lolita Messages postés 3 Date d'inscription lundi 14 juin 2021 Statut Membre Dernière intervention 13 août 2021 > yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024
13 août 2021 à 14:02
Je pensais peut être qu'il existait une variable dans le .contains() permettant de préciser si l'échelle était logarithmique ou bien linéaire.
Je n'avais pas du tout pensé à aborder les choses sous cet angle là mais c'est exactement ce que je cherchais, merci beaucoup!
0