2014-06-12 16 views
20

Matplotlib kullanarak bir karmaşa matrisinin görselleştirmesini oluşturmak istiyorum. Aşağıda gösterilen yöntemlerin parametreleri, sınıf etiketleri (alfabe), sınıflandırma sonuçları listeler (conf_arr) ve çıktı dosya adıdır. Şu ana kadarki sonuçtan oldukça memnunum: Son bir sorunla:Matplotlib: Onay işaretlerini keneler arasında taşı

Eksen işaretlerini kılavuz çizgileri arasında ortalayamıyorum. Kapsam parametresini aşağıdaki gibi imshow yöntemine iletirseniz, ızgara, olmasını istediğim gibi hizalar. Bunu açıklarsam, ızgara yanlış işaretlenir ancak etiketler olmasını isterdim. Sanırım ilgili kene ve bir sonraki kene arasındaki onay işaretini taşımanın bir yoluna ihtiyacım var ama bunun mümkün olup olmadığını bilmiyorum. üretilen Görüntü aşağıdaki gibi

enter image description here

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') 

:

Ben sol resimdeki gibi keneler/ızgara istiyorum ama ticklabels sağ resimdeki gibi bir konuma sahip olan Özetlemek gerekirse

+1

Bu sorunun çözümü (http://stackoverflow.com/questions/16162514/how-can-i-move-a-tick-label-onlywithout-moving-corresponding-tick) sizin için çalışıyor mu? – BrenBarn

+2

Muhtemel ilgili [matplotlib'deki onay işaretleri arasında x-tick etiketleri ortalanıyor] (http://stackoverflow.com/questions/17158382/centering-x-tick-labels-between-tick-marks-in-matplotlib) – M4rtini

+1

Bu bir açıkça yazılmış, iyi yazılmış bir soru! (+1) Neden reddedildiğinizden emin değilsiniz. –

cevap

19

Fark ettiğiniz gibi, varsayılan olarak ortalanırlar ve extent=[0, width, height, 0] belirterek varsayılan davranışı geçersiz kılarsınız.

Bunu işlemenin çeşitli yolları vardır. Biri, pcolor'u kullanmak ve kenar çizgileri ve çizgi stillerini kılavuz çizgileri gibi görünecek şekilde ayarlamak (bunun için pcolor'a ihtiyacınız var ve bunun çalışması için pcolormesh değil). Ancak, merkezdeki tıklamaları imshow varsayılan olarak yapmak için uzantıları değiştirmeniz gerekir. Alternatif

enter image description here

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() 

, sen küçük ızgara açmak ve piksel sınırlarında yerleştirin başladı. Sabit etiketler istediğinizden, her şeyi manuel olarak ayarlayacağız.

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() 

enter image description here

+1

Çabalarınız için çok teşekkür ederim, bu problemimi mükemmel bir şekilde çözüyor! :) – feob

1

Alternatif: Eğer im = ax.matshow(data, cmap='gray') yerine imshow() denedi Aksi takdirde, bir MultipleLocator daha mantıklı? Bu, ayrıca, etiket çizelgelerini doğru konuma yerleştirmelidir.

İlgili konular