2016-07-27 2 views
-1

Мой вопрос связан с форматом фигуры, сгенерированным с использованием библиотеки matplotlib.Задать некоторые цифры по оси x

Итак, по оси x у меня есть целые числа от 1 до 100, но в моем коде я рисую только данные, связанные с некоторыми числами (например, 1,5,77,86,97).

В конце концов, мой код показывает мне фигуру с осью х от 1 до 100.

Как я могу показать только нужные цифры (1,5,77,86,97)?

Мой код показан ниже:

def Plot(self,x,y, steps, nb,bool): 
    if(bool == False): 

     labelfont = { 
       'family' : 'sans-serif', # (cursive, fantasy, monospace, serif) 
       'color' : 'black',  # html hex or colour name 
       'weight' : 'normal',  # (normal, bold, bolder, lighter) 
       'size' : 20,   # default value:12 
       } 

     titlefont = { 
       'family' : 'serif', 
       'color' : 'black', 
       'weight' : 'bold', 
       'size' : 20, 
       } 

     x = np.array(x) 
     y = np.array(y) 
     pylab.plot(x, y, 
       'darkmagenta',      # colour 
       linestyle='',      # line style 
       linewidth=10,      # line width 
       marker = '+', 
       mew=6, ms=12) 

     axes = plt.gca() 
     axes.grid(True) 
     axes.set_xlim([1, x_max)   # x-axis bounds 
     axes.set_ylim([1, nb])    # y-axis bounds 

     pylab.title('Title' , fontdict=titlefont) 
     pylab.xlabel('x', fontdict=labelfont) 
     pylab.ylabel('y', fontdict=labelfont) 

     pylab.subplots_adjust(left=0.15)  # prevents overlapping of the y label 
    else: 
     test_steps.insert(0,"") 
     pylab.yticks(nb, steps,rotation=0, size=10) 
     pylab.margins(0.2) 
     pylab.xticks(np.arange(0, x_max, 1.0),rotation=90, size=10) 
     # Tweak spacing to prevent clipping of tick-labels 
     pylab.subplots_adjust(bottom=0.15) 
     F = pylab.gcf() 
     DefaultSize = F.get_size_inches() 
     if x_max < 100 and len(steps) < 100: 
      Xx = 2.5 
      Yy = 2.5 
     elif x_max < 200 and len(steps) < 200: 
      Xx = 5 
      Yy = 5 
     elif ix_max < 300 and len(steps) < 300: 
      Xx = 8 
      Yy = 8 
     elif x_max < 400 and steps < 400: 
      Xx = 10 
      Yy = 10 
     elif x_max < 500 and steps < 500: 
      Xx = 12 
      Yy = 12 
     else: 
      Xx = 15 
      Yy = 15 
     F.set_size_inches((DefaultSize[0]*Xx , DefaultSize[1]*Yy)) 
     F.savefig('Out.png', bbox_inches='tight') 
     pylab.close(F) 
+1

Пожалуйста, внесите свой код. – DavidG

+0

@DavidG: Я отредактировал мой пост –

ответ

2

Если у вас есть matplotlib.Axes объекта, который вы можете изменить тики вдоль оси х с set_xticks:

import matplotlib.pyplot as plt 
plt.plot([0,1,5,77,86,97],range(6),'o-') 
ax = plt.gca() 
ax.set_xticks([1,5,77,86,97]) 

с выходом:

enter image description here

EDIT: предполагается, что вы хотите выровнять значения, разделенные поровну (хотя в этот момент вам действительно нужно рассматривать что-то вроде гистограмм с цифрами в качестве меток), вы можете просто создать поддельную ось X и переименовать тики с помощью set_xticklabels:

import matplotlib.pyplot as plt 
x = range(5) 
y = range(5) 
real_x = [1,5,77,86,97] 
plt.plot(x,y,'o-') 
ax = plt.gca() 
ax.set_xticks(x) 
ax.set_xticklabels(real_x) 

enter image description here

+0

Я имею в виду, что расстояние между 1 и 5, 5 и 77, 77 и 86 ... должно быть одинаковым. –

+0

@StackOver Итак, что вы хотите, так это то, что они равномерно распределены, даже если разница между ними не то же самое? Вам нужен пример, который у меня выше, чтобы показать прямую линию? –

+0

Нет, не прямая линия, просто точки. Кривая не является непрерывной. вот так: http://stackoverflow.com/questions/12864294/adding-an-arbitrary-line-to-a-matplotlib-plot-in-ipython-notebook –

0

Как насчет маскировки х с у, а затем построение его? как:

pylap.plot(x[y != 0], y, 
      'darkmagenta',      # colour 
      linestyle='',      # line style 
      linewidth=10,      # line width 
      marker = '+', 
      mew=6, ms=12) 

Или, если у содержит больше чисел = 0, и вы хотите только построить те, которые перечислены выше, просто маска х с этими номерами ...

2

Что будет делать:

import matplotlib.pyplot as plt 
x = y = list(range(100)) 
idx = [1,5,77,86,97] 
new_y = [y[i] for i in idx] 
plt.plot(range(len(idx)), new_y, 'o-') 
plt.xticks(range(len(idx)),idx) 
plt.show() 

output

Если вы хотите только точки просто удалить -:

plt.plot(range(len(idx)), new_y, 'o') 
#        ---^--- instead of 'o-' 
+1

Приятно, что упрощает вещи –

+0

@ M.T спасибо :-) –

Смежные вопросы