Python Alter xticks matplotlib

Python Alter xticks matplotlib,python,pandas,matplotlib,plot,axis,Python,Pandas,Matplotlib,Plot,Axis,我有一个散点图,在x轴上有时间 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

我有一个散点图,在
x轴上有时间

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:

我想用总秒数交换实际时间戳,因此我包括:

plt.xticks(x_numbers, x)
这会导致x记号相互重叠

如果我使用:

plt.locator_params(axis='x', nbins=10) 
M = 10
xticks = ticker.MaxNLocator(M)
ax.xaxis.set_major_locator(xticks) 
结果与上述相同。如果我将
nbins
更改为较小的值,则刻度不会重叠,但它们不会与各自的散点对齐。正如在散点中一样,点与正确的时间戳不一致

如果我使用:

plt.locator_params(axis='x', nbins=10) 
M = 10
xticks = ticker.MaxNLocator(M)
ax.xaxis.set_major_locator(xticks) 
记号
不重叠,但不与各自的散点对齐

是否可以选择您使用但仍与相应数据点对齐的
x记号数

例如,对于下面的
。我可以用
n
记号数而不是全部记号数吗

产出2:


首先,时间间隔不一致。 其次,这是一个高频系列

在一般情况下,您不需要匹配每个条目对应的
xtick
。而且,在这些场景中,您可以利用类似于
plt.plot_date(x,y)
的东西,以及勾选
定位器和
格式化程序,比如
DayLocator()
日期格式化程序(“%y-%m-%d”)

虽然在这种非常特殊的情况下,数据处于分钟级别,很少有点接近,但黑客可能会尝试使用用于x轴的数字序列,
x_数字
。为了增加两点之间的间距,我尝试了
cumsum()
,为了在一定程度上消除重叠,我对
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()

让我们使用一些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()
输出:

我的数据集有点不同,但它可以复制到示例中。我需要另一个情节的总秒数,所以不能玩那些数字。谢谢,不过@deepaka不太清楚你在问什么。如果记号彼此足够接近,它们的标签将不可避免地重叠。什么样的自动机制能够防止这种情况发生?我正在尝试生成类似于输出1的东西,但将秒内的x记号替换为时间戳。当我交换时间戳时,x-ticks频率会改变。有没有办法使用与初始输出相同的频率?输出1显然是一个很好的干净频率。x记号不相互重叠,也不位于每个数据点。为什么在尝试插入时间戳时会发生更改?这有意义吗?我得到一个错误
NameError:name'xaxis'没有定义
@Punter345我遗漏了
xaxis=ax.get_axis()
@谢谢你看这个@Scott Boston。我得到的不是
namererror
,而是一个ValueError:
ValueError:unit缩写,没有数字
可以升级pandas和matplotlib。没有骰子。显然,它与pd.to_timedelta