2015-02-23 2 views
2

Я рисую даты и целые числа. Однако, поскольку диапазон дат составляет 100 дней друг от друга, matplotlib автоматически включает каждую дату между 100 днями, даже если только 20 или около того имеют данные для построения. Итак, мои вопросы: как я могу получить ось x только для создания дат, имеющих данные для построения? Кроме того, на данный момент даты сжимаются горизонтально, как я могу получить их по вертикали, чтобы все было в порядке?Как заставить ось x показывать только мои данные, которые я хочу построить? Вместо него, включая ярлыки без сюжетов?

Вот фотография моего графика на данный момент: enter image description here

Вот мой код:

import datetime as dt 
    import matplotlib.dates as mdates 

    array1 = ['2014-10-28', '2014-11-17', '2014-09-29', '2014-10-17', '2014-10-22'] 
    array2 = [1,4,5,6,9] 

    x = [dt.datetime.strptime(a,'%Y-%m-%d').date() for a in array1]  
    plt.plot_date((x), (array2), 'ro') 
    plt.show() 
+0

Или еще лучше, просто пример кусок кода, который работает. Гораздо труднее людям помочь вам, если им нужно заполнить пробелы. – will

+0

... и sendArray есть? – will

+0

Я жестко закодировал пример. Извините, что –

ответ

5

Итак, первое, вы можете использовать этого нужно просто функцию fig.autofmt_xdate(), чтобы иметь дело с XTICK этикеток автоматически - это самый простой способ.

Таким образом, вы будете иметь что-то вроде этого:

import datetime as dt 
import matplotlib.dates as mdates 
from matplotlib import pyplot 
from random import randint 


array1 = ['2014-10-28', '2014-11-17', '2014-09-29', '2014-10-17', '2014-10-22'] 
array2 = [1,4,5,6,9] 


dates = ["2014-{month:0>2d}-{day:0>2d}".format(month=m, day=d) for m in [1,5] for d in range(1,32)] 
dates = [dt.datetime.strptime(d, '%Y-%m-%d').date() for d in dates] 
freqs = [randint(0,4) for _ in dates] 

fig = pyplot.figure() 
ax = fig.add_subplot(1,1,1) 
ax.plot_date(dates, freqs, "ro") 

fig.autofmt_xdate() 

pyplot.show() 

enter image description here

, который до сих пор имеет большой разрыв вы не хотите, но клещ этикетки лучше.

Далее, чтобы иметь дело с разделом, есть несколько вариантов, но они еще не в основном matplotlib (что я знаю). Это сделано на самом деле рисунок двух участков, удаление шипов в середине, и с помощью опции sharey:

import datetime as dt 
import matplotlib.dates as mdates 
from matplotlib import pyplot 
from random import randint 
from matplotlib.ticker import MaxNLocator 


dates = ["2014-{month:0>2d}-{day:0>2d}".format(month=m, day=d) for m in [1,5] for d in range(1,10)] 
dates = [dt.datetime.strptime(d, '%Y-%m-%d').date() for d in dates] 
freqs = [randint(0,4) for _ in dates] 



fig = pyplot.figure() 

ax1 = fig.add_subplot(1,2,1) 
ax2 = fig.add_subplot(1,2,2, sharey=ax1) 

ax1.plot_date(dates, freqs, "ro") 
ax2.plot_date(dates, freqs, "ro") 


#set the upper and lower bounds for the two adjacent plots 
ax1.set_xlim(xmax=dt.datetime.strptime("2014-01-11", '%Y-%m-%d').date()) 
ax2.set_xlim(xmin=dt.datetime.strptime("2014-05-01", '%Y-%m-%d').date()) 


for ax in [ax1, ax2]: 
    _ = ax.get_xticklabels() #For some reason, if i don't do this, then it only prints years for the tick labels. :/ 
    ax.xaxis.set_major_locator(mdates.AutoDateLocator(maxticks=6)) 

#Turn off the spines in the middle 
ax1.spines['right'].set_visible(False) 
ax2.spines['left'].set_visible(False) 

ax1.yaxis.tick_left() 

ax2.get_yaxis().set_visible(False) 

pyplot.subplots_adjust(wspace=0.1) 

fig.autofmt_xdate() 

pyplot.show() 

Есть еще несколько дополнительных вещей, которые нужно для очистки, но я думаю, вы получите точку.

enter image description here

2

Вы можете вращать XTICK этикетки с:

plt.xticks(rotation=45) 

и сюжет даты равномерно вдоль оси x с использованием:

x = np.arange(n) 
ax.plot(x, array2, 'ro') 

, а затем переобозначений в xticks:

locs = x 
labels = [d.strftime('%b %d') for d in dates] 
plt.xticks(locs, labels) 

Однако обратите внимание, что побочный эффект установки Locs и этикетки вручную, что клещи больше не будут автоматически адаптироваться к изменениям масштаба, как правило, они когда вы будете использовать инструменты перевода графического интерфейса или масштабирования.


import time 
import datetime as dt 
import numpy as np 
import matplotlib.dates as mdates 
import matplotlib.pyplot as plt 

n, m = 20, 30 
now = dt.date.today() 
dates = [now+dt.timedelta(days=i) for i in range(n//2)+range(m,m+n//2)] 
x = np.arange(n) 
array2 = np.random.random(n) 

fig, ax = plt.subplots() 
ax.plot(x, array2, 'ro') 

locs = x 
labels = [d.strftime('%b %d') for d in dates] 
plt.xticks(locs, labels) 
plt.xticks(rotation=45) 
plt.show() 

дает

enter image description here

+0

Спасибо за ваш ответ. Но основная его часть до сих пор остается без ответа. Средняя часть графика является emtpy. и многие другие даты не имеют участков. Я хочу, чтобы ось x отображала только даты, которые они рисуют? –

+0

Не показывает ли последний график желаемый результат? – unutbu

+0

В некотором смысле, да. Но давайте скажем, что у меня есть 10 дат, у которых есть сюжеты, связанные с ними. Но диапазон дат между датами составляет 100 дней. Вместо того, чтобы строить 100 дней, есть ли способ, чтобы я мог только строить 10 дат равномерно по оси x? Спасибо за Ваш ответ. Было более чем достаточно помощи :) –

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