Polygon et contains

Résolu
B_Lolita Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
B_Lolita Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
peux-tu partager un programme que nous pouvons tester?
0
B_Lolita Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > B_Lolita Messages postés 3 Date d'inscription   Statut Membre Dernière intervention  
 
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   Statut Membre Dernière intervention   > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
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