2016-04-06 1 views
1

Je deviens assez désespérée à ce sujet, je ne pouvais pas trouver quoi que ce soit sur le www jusqu'à présent.python nuage de points taille de la zone proportionnelle axe longueur

est ici la situation:

  • Je travaille avec Python.
  • J'ai 3 tableaux: les coordonnées x, les coordonnées y et le rayon.
  • Je veux créer un diagramme de dispersion avec les coordonnées x et y données.

Jusqu'ici, tout fonctionne comme je le veux. Voici ce qui me dérange:

  • La taille du cercle de chaque point dans le nuage de points devrait être définie par le tableau de rayons.
  • Les valeurs des coordonnées et du rayon sont dans les mêmes unités. Plus explicitement: Supposons que j'ai un point à (1, 1) avec le rayon 0.5 assigné. Ensuite, je veux obtenir un cercle dans l'intrigue centré à (1, 1) et avec la frontière passant par les points (1.5, 1), (1, 1.5), (0.5, 1) et (1, 0.5)

Ce que je lutte avec est de trouver le rapport des points de l'intrigue à la longueur dans un axe. J'ai besoin de travailler avec des points car pour autant que je puisse voir, la taille du cercle du diagramme de dispersion est donnée en valeurs ponctuelles. Donc, disons que mon axe va de 0 à 10, j'ai besoin de savoir combien de points il y a entre les deux dans l'intrigue.

Quelqu'un peut-il m'aider? Ou y a-t-il une autre façon de faire cela? Merci d'avance.

+0

Ceci est une chose difficile à faire matplotlib - ici est un bon point de départ: http://stackoverflow.com/questions/14827650/pyplot-scatter-plot-marker-size –

Répondre

0

Je saute de l'autre stackoverflow question. Je pense que l'approche que vous avez présenté comme un answer to the present question ne fonctionnera pas exactement comme vous voulez pour les raisons suivantes:

  • D'abord, la taille des marqueurs est en points, et non en pixels. En typographie, the point est la plus petite unité de mesure et correspond en matplotlib à une longueur fixe de 1/72 de pouce. En revanche, la taille d'un pixel varie en fonction de la taille et du dpi.
  • Deuxièmement, la taille des marqueurs dans plt.scatter sont liées au diamètre des cercles, pas le rayon.

Ainsi, la taille en points de chaque marqueur doit être calculée comme suit:

size_in_points = (2 * radius_in_pixels/fig_dpi * 72 points/inch)**2

En outre, comme représenté sur la MWF ci-dessous, il est possible de calculer la taille du rayon de marqueur en pixels directement avec matplotlib transformations, sans avoir à générer une figure vide préalable:

import numpy as np 
import matplotlib.pyplot as plt 

plt.close('all') 

# Generate some data : 
N = 25 
x = np.random.rand(N) + 0.5 
y = np.random.rand(N) + 0.5 
r = np.random.rand(N)/10 

# Plot the data : 
fig = plt.figure(facecolor='white', figsize=(7, 7)) 
ax = fig.add_subplot(111, aspect='equal') 
ax.grid(True) 
scat = ax.scatter(x, y, s=0, alpha=0.5, clip_on=False) 
ax.axis([0, 2, 0, 2]) 

# Draw figure : 
fig.canvas.draw() 

# Calculate radius in pixels : 
rr_pix = (ax.transData.transform(np.vstack([r, r]).T) - 
      ax.transData.transform(np.vstack([np.zeros(N), np.zeros(N)]).T)) 
rpix, _ = rr_pix.T 

# Calculate and update size in points: 
size_pt = (2*rpix/fig.dpi*72)**2 
scat.set_sizes(size_pt) 

# Save and show figure: 
fig.savefig('scatter_size_axes.png') 
plt.show() 

enter image description here

Un point en (1, 1) avec un rayon de 0,5 assigné donnera un cercle dans le tracé centré à (1, 1) et avec la bordure traversant les points (1.5, 1), (1, 1.5), (0,5, 1) et (1, 0.5):

enter image description here