#python #matplotlib
#python #matplotlib
Вопрос:
Итак, я пытаюсь отобразить некоторую аналитику в моем веб-приложении на Python. Я хочу отобразить дату и время для первой и последней записей на оси x.
Я попытался установить отметки в виде списка с двумя записями, но это дало плохой результат.
plt.scatter(x_data, y_data)
plt.grid(True)
plt.xticks(x_data, [x_data[0], x_data[-1]])
fig = plt.gcf()
Где находится x_data:
['10:59:44 27-03-2019', '11:00:07 27-03-2019', '11:00:09 27-03-2019', '11:00:12 27-03-2019', '11:30:23 27-03-2019', '11:30:29 27-03-2019', '11:30:30 27-03-2019', '11:30:31 27-03-2019', '11:30:32 27-03-2019', '11:32:44 27-03-2019', '11:33:21 27-03-2019', '11:35:50 27-03-2019', '12:16:12 27-03-2019', '12:16:39 27-03-2019', '12:17:36 27-03-2019', '12:19:40 27-03-2019', '12:23:50 27-03-2019']
Я ожидал, что вывод разместит одну в крайнем левом углу, а другую в крайнем правом. Вместо этого первые две отметки просто показывали, что времена перекрываются.
Я не уверен, как правильно это сделать.
Комментарии:
1. вы пробовали
plt.xticks
без второго аргумента? для установки ограничений оси естьplt.xlim
функция2. Если я правильно понимаю, вы хотите, чтобы отображались все отметки, но отображалась только метка для первой и последней?
3. Да, я действительно хочу, чтобы отображались другие отметки, но чтобы первая и последняя были помечены.
Ответ №1:
Вот обходное решение, использующее некоторые случайные данные, потому что вы не указали, что такое y_data
. Идея состоит в том, чтобы перебрать существующие метки по умолчанию, а затем заменить все метки на пустые строки, кроме первой и последней.
fig, ax = plt.subplots()
plt.scatter(x_data, range(len(x_data)))
plt.grid(True)
fig.canvas.draw()
xticks = ax.get_xticklabels()
labels_new = [lab.get_text() if i in [0, len(xticks)-1] else ""
for i, lab in enumerate(xticks) ]
ax.set_xticklabels(labels_new)
plt.show()
Комментарии:
1. Это хороший обходной путь. Если нет официального способа, то это подойдет. Спасибо!
Ответ №2:
Я подозреваю, что ваша проблема заключается в том, что вы определяете вектор отметок, а затем присваиваете две метки (в позиции 0 и 1).
import numpy as np
import matplotlib.pyplot as plt
x_data=np.array([1,2,3,4,5,6,7,8])
y_data=np.random.normal(0, 1, (8, 1))
# create an array for your labels
new_labels=[''] * (len(x_data)-2)
new_labels.insert(0,x_data[0])
new_labels.append(x_data[-1])
plt.scatter(x_data, y_data)
plt.grid(True)
plt.xticks(x_data, new_labels) #use the new tick labels
fig = plt.gcf()
Комментарии:
1. Нет, это приводит к искаженному выводу ( oi65.tinypic.com/2j5qm9.jpg )
2. да, конечно. Я добавил список в качестве второй метки =). Теперь это должно сработать