Polygon et contains

Résolu
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

  1. Contributeur
    bonjour,
    je pense qu'en ligne 8 et 9, tu dois utiliser le logarithme.
    n'as-tu pas oublié de nous communiquer certains imports?
    1. Contributeur
      peux-tu partager un programme que nous pouvons tester?
    2. @yg_beBonjour,
      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
    3. Contributeur
      @B_Lolitaquelle 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))
    4. @yg_beJe 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!