Polygon et contains
Résolu
B_Lolita
Messages postés
4
Statut
Membre
-
B_Lolita Messages postés 4 Statut Membre -
B_Lolita Messages postés 4 Statut Membre -
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
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

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
A voir également:
- Polygon et contains
- Local-part of envelope rcpt address contains utf8 but remote server did not offer smtputf8 - Forum Javascript
- Ecriture avec des caractères incongrus avec thunderbird - Forum Mail
- Encodage d'un fichier en UTF-8 (sans bom) - Forum Programmation
- ANSI et UTF8 sans BOM - Forum Webmastering
- This disc contains a "udf" file system and requires an operating system that supports the iso-13346 "udf" file system specification. - Forum TV & Vidéo
1 réponse
yg_be
Messages postés
24281
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 585
bonjour,
je pense qu'en ligne 8 et 9, tu dois utiliser le logarithme.
n'as-tu pas oublié de nous communiquer certains imports?
je pense qu'en ligne 8 et 9, tu dois utiliser le logarithme.
n'as-tu pas oublié de nous communiquer certains imports?
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
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))Je n'avais pas du tout pensé à aborder les choses sous cet angle là mais c'est exactement ce que je cherchais, merci beaucoup!