Уменьшить количество отметок на оси X, где метки являются датой - PullRequest
0 голосов
/ 20 декабря 2018

Я новичок в matplotlib, создаю график с использованием matplotlib.plot, ось x помечена датами, а Y - числами

x = ['2018-08-17', '2018-08-20', '2018-08-21', '2018-08-22', '2018-08-23', '2018-08-24', '2018-08-27', '2018-08-28', '2018-08-29', '2018-08-30', '2018-08-31','2018-11-29', '2018-11-30', '2018-12-03', '2018-12-04', '2018-12-05']

y = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

Я преобразую эти строковые даты в действительную дату, используя следующий код

xdates = [dt.strptime(dstr,'%Y-%m-%d').date() for dstr in x]

после преобразования его в даты, я попытался

plt.xticks(range(0,len(xdates),2),xdates[1::2],rotation=50)

plt.plot(xdates,y)

, но это ничего не делает.

Я хочу, чтобы на оси х было меньше меток и меток.Предположим, что есть 15 дат, но я хочу, чтобы на оси х отображалось только 7 или 8 дат.Как мне этого добиться?

Ниже приведен метод, который я использую для создания графика тренда

def _create_trend_graph(self,element):
    if(len(self.processed_data)!=0):

        x_axis = element['X-Axis']
        y_axis = []
        plt.xticks(rotation=70)
        plt.yticks(np.arange(0, 10001,element['Range']))
        #plt.yticks(np.arange(0, 101,10))
        figure = plt.gcf()  # get current figure
        figure.set_size_inches(14, 8)
        for key in element.iterkeys():
            if key.lower().startswith("y-axis"):
                self.null_index = len(self.processed_data[element[key]])
                for index in range(len(self.processed_data[element[key]])):
                    if self.processed_data[element[key]][index] == 'Null':
                        self.null_index = index
                        break
                plt.plot(self.processed_data[x_axis][:self.null_index], list(map(float, self.processed_data[element[key]][:self.null_index])))
                y_axis = y_axis + [str(element[key])]
        #plt.legend(y_axis, prop={'size': 16})
        plt.legend(y_axis)
        plt.rcParams['font.size'] = 10.0
        plt.savefig(self.monitored_folder+element['Title'], bbox_inches='tight', dpi = 100)
        plt.close()
        self._add_image_to_body(str(element['Title']), str(element['height']), str(element['width']))
    else:
        self._create_NA()

Здесь у элемента ['X-Axis'] у нас есть даты, например,

['2018-08-17', '2018-08-20', '2018-08-21', '2018-08-22', '2018-08-23', '2018-08-24 ',' 2018-08-27 ',' 2018-08-28 ',' 2018-08-29 ',' 2018-08-30 ',' 2018-08-31 ',' 2018-11-29 ', '2018-11-30', '2018-12-03', '2018-12-04', '2018-12-05']

и по оси Y мы помещаем числа.Таким образом, проблема в том, что мы получаем большое количество дат в элементе ['X-Axis'], так что это делает Xaxis очень многолюдным.также число дат в будущем может увеличиться.

Одним из решений является увеличение размера графика, но это последнее, что мы хотим сделать.Я не могу прикрепить изображение, так как у меня мало репутации.Как еще я могу показать вам изображение @ ImportanceofbeingErnest

после генерации графика мы передаем его методу ниже

def _add_image_to_body(self,image_name,height,width):
    attachment = self.mail.Attachments.Add(self.monitored_folder+image_name+'.png')
    attachment.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", image_name.replace(' ','_'))
    self.html += ("<img src=\"cid:" + image_name.replace(' ', '_') + '\"' + " height="+height+" width="+width+"><br><br>")

1 Ответ

0 голосов
/ 20 декабря 2018

Я думаю, что проблема, с которой вы сталкиваетесь, заключается в том, что AutoDateLocator matplotlib в настоящее время помечается каждые 29 числа месяца, так что его метка будет перекрываться с первым в следующем месяце.

import matplotlib.pyplot as plt
from datetime import datetime as dt

x = ['2018-08-17', '2018-08-20', '2018-08-21', '2018-08-22', '2018-08-23', '2018-08-24', 
     '2018-08-27', '2018-08-28', '2018-08-29', '2018-08-30', '2018-08-31','2018-11-29', 
     '2018-11-30', '2018-12-03', '2018-12-04', '2018-12-05']
y = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

xdates = [dt.strptime(dstr,'%Y-%m-%d') for dstr in x]

plt.plot(xdates,y)

plt.setp(plt.gca().get_xticklabels(), rotation=60, ha="right")
plt.tight_layout()
plt.show()

enter image description here

Это можно рассматривать как ошибку.Но это исправлено в текущей версии разработки, так что из matplotlib 3.1 эта проблема больше не должна возникать.

Обходной путь - определить тикер самостоятельно, который будет отмечать каждое первое и 15-е число месяца.

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from datetime import datetime as dt

x = ['2018-08-17', '2018-08-20', '2018-08-21', '2018-08-22', '2018-08-23', '2018-08-24', 
     '2018-08-27', '2018-08-28', '2018-08-29', '2018-08-30', '2018-08-31','2018-11-29', 
     '2018-11-30', '2018-12-03', '2018-12-04', '2018-12-05']
y = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

xdates = [dt.strptime(dstr,'%Y-%m-%d') for dstr in x]

plt.plot(xdates,y)

plt.gca().xaxis.set_major_locator(mdates.DayLocator((1,15)))
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter("%Y-%m-%d"))
plt.setp(plt.gca().get_xticklabels(), rotation=60, ha="right")
plt.tight_layout()
plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...