outside how font example change python matplotlib

how - subplot python



Matplotlib: Mueve las marcas entre las marcas (2)

Quiero crear una visualización de una matriz de confusión usando matplotlib. Los parámetros de los métodos que se muestran a continuación son las etiquetas de clase (alfabeto), los resultados de la clasificación como una lista de listas (conf_arr) y un nombre de archivo de salida. Estoy bastante contento con el resultado hasta ahora, con un último problema:

No puedo centrar las etiquetas de marca de eje entre las líneas de la cuadrícula. Si paso el parámetro de extensión al método imshow como se muestra a continuación, la cuadrícula se alinea como me gustaría. Si lo comento, la cuadrícula está desalineada pero las etiquetas son donde me gustaría que estuvieran. Creo que necesito una forma de mover la marca de verificación entre la marca asociada y la siguiente, pero no sé si y cómo es posible.

Para resumir, quiero que la cuadrícula / ticks como en la imagen de la izquierda, pero las marcas de posición colocados como en la imagen derecha:

def create_confusion_matrix(alphabet, conf_arr, outputname): norm_conf = [] width = len(conf_arr) height = len(conf_arr[0]) for i in conf_arr: a = 0 tmp_arr = [] a = sum(i, 0) for j in i: tmp_arr.append(float(j)/float(a)) norm_conf.append(tmp_arr) fig = plt.figure(figsize=(14,14)) #fig = plt.figure() plt.clf() ax = fig.add_subplot(111) ax.set_aspect(1) ax.grid(which=''major'') res = ax.imshow(np.array(norm_conf), cmap=plt.cm.binary, interpolation=''none'', aspect=''1'', vmax=1, ##Commenting out this line sets labels correctly, ##but the grid is off extent=[0, width, height, 0] ) divider = make_axes_locatable(ax) cax = divider.append_axes("right", size="5%", pad=0.2) cb = fig.colorbar(res, cax=cax) #Axes ax.set_xticks(range(width)) ax.set_xticklabels(alphabet, rotation=''vertical'') ax.xaxis.labelpad = 0.5 ax.set_yticks(range(height)) ax.set_yticklabels(alphabet, rotation=''horizontal'') #plt.tight_layout() plt.savefig(outputname, format=''png'')

La imagen producida se ve así:


Alternativamente: ¿has probado im = ax.matshow(data, cmap=''gray'') lugar de imshow() ? Esto también debe colocar las etiquetas en la posición correcta.


Como se ha dado cuenta, están centrados de forma predeterminada y está anulando el comportamiento predeterminado especificando extent=[0, width, height, 0] .

Hay varias maneras de manejar esto. Una es usar pcolor y configurar los edgecolors y linestyles para que se parezcan a las líneas de cuadrícula (en realidad necesitas pcolor y no pcolormesh para que esto funcione). Sin embargo, tendrá que cambiar las extensiones para obtener los ticks en el centro como imshow hace de forma predeterminada.

import matplotlib.pyplot as plt import numpy as np data = np.random.random((10,10)) labels = ''abcdefghij'' fig, ax = plt.subplots() im = ax.pcolor(data, cmap=''gray'', edgecolor=''black'', linestyle='':'', lw=1) fig.colorbar(im) # Shift ticks to be at 0.5, 1.5, etc for axis in [ax.xaxis, ax.yaxis]: axis.set(ticks=np.arange(0.5, len(labels)), ticklabels=labels) plt.show()

Alternativamente, puede activar la cuadrícula menor y colocarla en los límites de píxeles. Como quieres etiquetas fijas, solo configuraremos todo manualmente. De lo contrario, un MultipleLocator tendría más sentido:

import matplotlib.pyplot as plt import numpy as np data = np.random.random((10,10)) labels = ''abcdefghij'' fig, ax = plt.subplots() im = ax.imshow(data, cmap=''gray'', interpolation=''none'') fig.colorbar(im) # Set the major ticks at the centers and minor tick at the edges locs = np.arange(len(labels)) for axis in [ax.xaxis, ax.yaxis]: axis.set_ticks(locs + 0.5, minor=True) axis.set(ticks=locs, ticklabels=labels) # Turn on the grid for the minor ticks ax.grid(True, which=''minor'') plt.show()