2016-03-27 38 views
0

Bir kod oluşturmak için matplotlib ve numpy kullanan bir kodum (kod izler) var. Şu an için gereksinimim var:Tamsayı kene etiketleri matplotlib, yok kökeni etiketleri yok

  1. Eksenlerin tamsayı kenarı olmasını istiyorum.
  2. Eksenler keneler, sıfırlar içermeyecek, örneğin 1.0 veya 2.0, ancak bunun yerine 1 ve 2 olmalıdır. x=0 ve y=0 için keneler gizlenecektir (kaynak keneler).

Bu kod ile bunu başardık:

import numpy 
import matplotlib.pyplot as plt 
import matplotlib as mp 
from matplotlib.ticker import FormatStrFormatter 

# approximately a circle 
x1 = [0.3, 1.0, 1.3, 1.3, 1.0, 0.3, -0.3, -1.0, -1.3, -1.3, -1.0, -0.3] 
y1 = [1.7, 1.2, 0.6, -0.2, -1.2, -1.5, -1.5, -1.2, -0.2, 0.6, 1.2, 1.7] 

number_of_values = 12 
x2 = numpy.random.uniform(low=-1.0, high=1.0, size=number_of_values) 
y2 = numpy.random.uniform(low=-1.0, high=1.0, size=number_of_values) 


fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.scatter(x1, y1, s=100, color='#FF0000', linewidth='1.5', marker='x', label='$y=1$') 
ax.scatter(x2, y2, s=100, facecolors='none', edgecolors='#66AAAA', linewidth='1.5', marker='o', label='$y=0$') 

ax.legend(loc='upper right') 
ax.grid(True) 

# LIMITS 
x_lower_limit = min(x1) - 0.2 * max(x1) 
x_upper_limit = 1.2 * max(x1) 
ax.set_xlim(-2.0, 2.0) 

y_lower_limit = min(y1) - 0.2 * max(y1) 
y_upper_limit = 1.2 * max(y1) 
ax.set_ylim(-2.0, 2.0) 

# ORIGIN AXIS 
ax.spines['left'].set_position('center') 
ax.spines['right'].set_color('none') 
ax.spines['bottom'].set_position('center') 
ax.spines['top'].set_color('none') 

ax.spines['left'].set_smart_bounds(True) 
ax.spines['bottom'].set_smart_bounds(True) 

ax.xaxis.set_ticks_position('bottom') 
ax.yaxis.set_ticks_position('left') 

ax.set_xlabel('$x_1$', fontsize=14)#, x=0.9, y=1, labelpad=0.6) 
ax.set_ylabel('$x_2$', fontsize=14, rotation=0)#, x=1, y=0.9, labelpad=0.6) 

ax.xaxis.set_label_coords(1.04, 0.5) 
ax.yaxis.set_label_coords(0.5, 1.02) 

ax.set_xticks([-2.0, -1.0, 1.0, 2.0]) 
ax.set_yticks([-2.0, -1.0, 1.0, 2.0]) 

plt.title('Non-linear Decision Boundary', y=1.06) 

plt.show() 

Ancak, ben orada kene hardcoding ediyorum, gördüğünüz gibi - kötü uygulama. Bunu yapmanın bu yolunu geliştirmek istiyorum. Ben yani SO yayının çözümlerini aşağıdaki şimdiye kadar başka yöntemler denedim:

trimming trailing xtick zeros

sorunu burada deyişle, aslında bile işe gelmez. Sabit kodlanmış ax.set_xticks([-2.0, -1.0, 1.0, 2.0]) ve ax.set_yticks([-2.0, -1.0, 1.0, 2.0])'u kaldırdığımda, bu çizim çizgilerin 0.5 adımlarını kamalarda göstermesini ve sıfırlar olduğunu gösterir.

modify tick labels text

bu sorun ben ' ' gibi bir şeye kene etiketini değiştirmek, yine 0.0 olarak bu yorumlamak ve sondaki sıfırları ve non tam sayı değerlerini işlemek edeceğiz olmasıdır.

Kene etiketlerinin değerlerini kodlamayı nasıl engelleyebilirim? Bazı frekansları ayarlamak istiyorum: şunun gibi:

Bu, tüm onay etiketlerinin üzerinde yinelemekten kaçınacaktır. Gerekirse, kene etiketleri üzerinde yineleme gerekli bir kötülük olurdu, ama sanırım böyle bir yineleme olmadan bir yolu olmalı.

sabit kodlu kene yerini alabilir

cevap

0

: Bir adım büyüklüğü 1 ve özel bir FuncFormatter ile MultipleLocator ile

ax.set_xticks([-2.0, -1.0, 1.0, 2.0]) 
ax.set_yticks([-2.0, -1.0, 1.0, 2.0]) 

(sıfır atlamak için):

import matplotlib.ticker as ticker 
loc = ticker.MultipleLocator(1) 
ax.xaxis.set_major_locator(loc) 
ax.yaxis.set_major_locator(loc) 
def fmt(x, pos): 
    return '' if x == 0 else '{:.0f}'.format(x) 
ax.xaxis.set_major_formatter(ticker.FuncFormatter(fmt)) 
ax.yaxis.set_major_formatter(ticker.FuncFormatter(fmt)) 

enter image description here