Странное поведение при рендеринге тиков оси X
Я строю график в matplotlib с помощью метода панды df.plot(), но почему-то метки тиков на оси X кажутся перепутанными. Кажется, что есть слой числового текста над моими "настоящими" тиковыми метками. Я понятия не имею, откуда это берется. Как ни странно, это происходит только в нашей производственной среде и среде постановки, но не в dev. Возможно, это также связано с gunicorn или dev-сервером django. Кто-нибудь уже сталкивался с подобным?
Вот результат построения графика:
и вот вывод, когда я очищаю тики с помощью .set_xticks([], []):
Вот часть моего кода, есть некоторая абстракция, но я думаю, что это должно быть понятно. self.data это pandas dataframe. Он выводит данные png в base64-кодировке:
class Line(ChartElement):
def draw(self):
self._plot = self.data.plot(kind='line', color=self.colors)
self._rotation = 'vertical'
self._horizontalalignment='center'
# self._plot.set_xticks([], [])
# ...
class ChartElement():
# ...
def base64(self):
self.draw()
figfile = BytesIO()
if not self._plot:
raise ValueError("Plot not generated.")
if self._legend:
self._plot.legend(self._legend, **self._legend_args)
#plt.legend(self._legend, loc='upper center', bbox_to_anchor=(0.4, .05), ncol=5, fancybox=False, prop={'size': 6})
plt.setp(self._plot.get_xticklabels(), rotation=self._rotation, horizontalalignment=self._horizontalalignment, fontsize=8)
self._plot.set_ylabel(self.y_title)
self._plot.set_xlabel(self.x_title)
#plt.figure()
fig = self._plot.get_figure()
fig.autofmt_xdate()
if self.size and isinstance(self.size, list):
fig.set_size_inches(inch(self.size[0]), inch(self.size[1]))
fig.savefig(figfile, format='png', bbox_inches='tight')
figfile.seek(0)
figdata_png = base64.b64encode(figfile.getvalue())
plt.clf()
plt.cla()
plt.close('all')
plt.close()
return figdata_png.decode('utf8')
Мне удалось решить эту проблему, и это была моя вина :). Я как-то упустил из виду мажорные и минорные тики.
Я исправил это, отключив метки минорных тиков сразу после метода self.draw():
self._plot.tick_params(axis='x', which='minor', bottom=True, top=False, labelbottom=False)
Это не объясняет, почему они не отображаются в среде dev, но пока все в порядке. Возможно, разные настройки по умолчанию!

