Cómo dibujar una línea dentro de un diagtwig de dispersión

No puedo creer que esto sea tan complicado, pero probé y busqué en Google por un tiempo.

Solo quiero analizar mi diagtwig de dispersión con algunas características gráficas. Para empezar, quiero añadir simplemente una línea.

Entonces, tengo unos (4) puntos y quiero agregarle una línea, como en este gráfico (fuente: http://en.wikipedia.org/wiki/File:ROC_space-2.png )

introduzca la descripción de la imagen aquí

Ahora, esto no funcionará. Y, francamente, el conjunto de documentación-ejemplos-galería y el contenido de matplotlib es una mala fuente de información.

Mi código se basa en un simple diagtwig de dispersión de la galería:

# definitions for the axes left, width = 0.1, 0.85 #0.65 bottom, height = 0.1, 0.85 #0.65 bottom_h = left_h = left+width+0.02 rect_scatter = [left, bottom, width, height] # start with a rectangular Figure fig = plt.figure(1, figsize=(8,8)) axScatter = plt.axes(rect_scatter) # the scatter plot: p1 = axScatter.scatter(x[0], y[0], c='blue', s = 70) p2 = axScatter.scatter(x[1], y[1], c='green', s = 70) p3 = axScatter.scatter(x[2], y[2], c='red', s = 70) p4 = axScatter.scatter(x[3], y[3], c='yellow', s = 70) p5 = axScatter.plot([1,2,3], "r--") plt.legend([p1, p2, p3, p4, p5], [names[0], names[1], names[2], names[3], "Random guess"], loc = 2) # now determine nice limits by hand: binwidth = 0.25 xymax = np.max( [np.max(np.fabs(x)), np.max(np.fabs(y))] ) lim = ( int(xymax/binwidth) + 1) * binwidth axScatter.set_xlim( (-lim, lim) ) axScatter.set_ylim( (-lim, lim) ) xText = axScatter.set_xlabel('FPR / Specificity') yText = axScatter.set_ylabel('TPR / Sensitivity') bins = np.arange(-lim, lim + binwidth, binwidth) plt.show() 

Todo funciona, excepto el p5 que es una línea.

Ahora, ¿cómo se supone que funciona esto? ¿Qué es una buena práctica aquí?

plot toma valores yy y usa x como matriz de índice 0..N-1 o x e y valores como se describe en la documentación . Para que pudieras usar

 p5 = axScatter.plot((0, 1), "r--") 

en su código para trazar la línea.

Sin embargo, usted está pidiendo “buenas prácticas”. El siguiente código (con suerte) muestra algunas “buenas prácticas” y algunas de las capacidades de matplotlib para crear la ttwig que mencionas en tu pregunta.

 import numpy as np import matplotlib.pyplot as plt # create some data xy = np.random.rand(4, 2) xy_line = (0, 1) # set up figure and ax fig, ax = plt.subplots(figsize=(8,8)) # create the scatter plots ax.scatter(xy[:, 0], xy[:, 1], c='blue') for point, name in zip(xy, 'ABCD'): ax.annotate(name, xy=point, xytext=(0, -10), textcoords='offset points', color='blue', ha='center', va='center') ax.scatter([0], [1], c='black', s=60) ax.annotate('Perfect Classification', xy=(0, 1), xytext=(0.1, 0.9), arrowprops=dict(arrowstyle='->')) # create the line ax.plot(xy_line, 'r--', label='Random guess') ax.annotate('Better', xy=(0.3, 0.3), xytext=(0.2, 0.4), arrowprops=dict(arrowstyle='<-'), ha='center', va='center') ax.annotate('Worse', xy=(0.3, 0.3), xytext=(0.4, 0.2), arrowprops=dict(arrowstyle='<-'), ha='center', va='center') # add labels, legend and make it nicer ax.set_xlabel('FPR or (1 - specificity)') ax.set_ylabel('TPR or sensitivity') ax.set_title('ROC Space') ax.set_xlim(0, 1) ax.set_ylim(0, 1) ax.legend() plt.tight_layout() plt.savefig('scatter_line.png', dpi=80) 

scatter_with_line.png

Por cierto: creo que la documentación de matplotlibs es bastante útil hoy en día.

La línea p5 debe ser:

 p5 = axScatter.plot([1,2,3],[1,2,3], "r--") 

el argumento 1 es una lista de los valores de x, y el argumento 2 es una lista de los valores de y

Si solo desea una línea recta, solo debe proporcionar valores para los extremos de la línea.