Alter xticks matplotlib - PullRequest
       26

Alter xticks matplotlib

0 голосов
/ 28 июня 2018

У меня есть график рассеяния, который имеет время на x-axis

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import ticker

d = ({
    'A' : ['08:00:00','08:10:00','08:12:00','08:26:00','08:29:00','08:31:00','10:10:00','10:25:00','10:29:00','10:31:00'],
    'B' : ['1','1','1','2','2','2','7','7','7','7'],     
    'C' : ['X','Y','Z','X','Y','Z','A','X','Y','Z'],
    })

df = pd.DataFrame(data=d)

fig,ax = plt.subplots()

x = df['A']
y = df['B']

x_numbers = (pd.to_timedelta(df['A']).dt.total_seconds())

plt.scatter(x_numbers, y)
plt.show()

Выход 1: enter image description here

Я хотел обменять общее количество секунд на фактические метки времени, поэтому я включил:

plt.xticks(x_numbers, x)

В результате x-метки перекрывают друг друга.

Если я использую:

plt.locator_params(axis='x', nbins=10) 

Результаты такие же, как указано выше. Если я поменяю nbins на что-то меньшее, то тики не перекрываются, но не совпадают с их точками рассеяния Как и в точках разброса, не совпадают с правильной отметкой времени.

Если я использую:

M = 10
xticks = ticker.MaxNLocator(M)
ax.xaxis.set_major_locator(xticks) 

ticks не перекрываются, но не совпадают с соответствующими точками рассеяния.

Можно ли выбрать число x-ticks, которое вы используете, но все еще выровнено с соответствующей точкой данных.

например. Для figure ниже. Могу ли я просто использовать n число ticks вместо всех?

Выход 2:

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Позвольте использовать некоторые манипуляции с xticklabel:

d = ({
    'A' : ['08:00:00','08:10:00','08:12:00','08:26:00','08:29:00','08:31:00','10:10:00','10:25:00','10:29:00','10:31:00'],
    'B' : ['1','1','1','2','2','2','7','7','7','7'],     
    'C' : ['X','Y','Z','X','Y','Z','A','X','Y','Z'],
    })

df = pd.DataFrame(data=d)

fig,ax = plt.subplots()

x = df['A']
y = df['B']

x_numbers = (pd.to_timedelta(df['A']).dt.total_seconds())

plt.scatter(x_numbers, y)
loc, labels = plt.xticks()
newlabels = [str(pd.Timedelta(str(i)+ ' seconds')).split()[2] for i in loc]
plt.xticks(loc, newlabels)
plt.show()

Выход: enter image description here

0 голосов
/ 28 июня 2018

Во-первых, временной интервал не соответствует. Во-вторых, это высокочастотный ряд.

В общем случае от вас не требуется совпадать с xticks, соответствующим каждой записи. И в этих сценариях вы можете использовать что-то вроде plt.plot_date(x, y) наряду с галочками locators и formatters вроде DayLocator() и DateFormatter('%Y-%m-%d').

Хотя для этого очень специфического случая, когда данные находятся на минутном уровне, а несколько точек действительно близки, возможно, попытка поиграть с числовой серией, которую вы используете для оси x, x_numbers. Для увеличения разрыва между двумя точками я попытался cumsum(), а для устранения перекрытия до некоторой степени дал от rotation до xticks.

fig, ax = plt.subplots(figsize=(10,6))

x = df['A']
y = df['B']

x_numbers = (pd.to_timedelta(df['A']).dt.total_seconds()).cumsum()

plt.scatter(x_numbers, y)
plt.xticks(x_numbers, x, rotation=50)
plt.show()

enter image description here

...