Python Matplotlib问题:时间序列数据的x轴重新映射

Python Matplotlib问题:时间序列数据的x轴重新映射,python,pandas,matplotlib,seaborn,Python,Pandas,Matplotlib,Seaborn,我想使用MatPlotLib绘制时间序列数据。数据以csv格式存储,我使用pd.read_csv将其处理为数据帧,效果很好。一个数据集包括一个时间戳列和大约10个值列。我最初通过pd将时间戳转换为格式为yyyy-MM-dd hh:MM:ss的字符串,转换为_datetimedataFrame['TIMESTAMP',格式=“%Y-%m-%d%H:%m:%S”的datetime 为了绘制数据,我使用以下代码生成示例数据,这不是我的代码的一部分: 将matplotlib.pyplot作为plt导入

我想使用MatPlotLib绘制时间序列数据。数据以csv格式存储,我使用pd.read_csv将其处理为数据帧,效果很好。一个数据集包括一个时间戳列和大约10个值列。我最初通过pd将时间戳转换为格式为yyyy-MM-dd hh:MM:ss的字符串,转换为_datetimedataFrame['TIMESTAMP',格式=“%Y-%m-%d%H:%m:%S”的datetime

为了绘制数据,我使用以下代码生成示例数据,这不是我的代码的一部分:

将matplotlib.pyplot作为plt导入 作为pd进口熊猫 将numpy作为np导入 导入seaborn作为sns N=30 时间戳=pd.日期\u范围'2020-01-16 8:00',周期=N,频率=72s' 注意:原始时间戳的间隔并不均匀,这只是要测试的数据 dataFrame=pd.dataFrame{'TIMESTAMP':时间戳'Y1':np.random.normal100,30,N,'Y2':np.random.normal100,30,N} acqFieldName='Y1' 图=sns.pointplotx='TIMESTAMP',y=acqFieldName,数据=dataFrame,比例=0.75 时间戳=数据帧['TIMESTAMP'].dt.time 图:轴。设置xticklabelslabels=时间戳,旋转=45 节目 其结果如下:

fig = sns.pointplot(x='TIMESTAMP', y=acqFieldName, data=dataFrame, scale=0.75)
timestamps = dataFrame['TIMESTAMP'].dt.time

xmin = dataFrame['TIMESTAMP'][0]
xmax = dataFrame['TIMESTAMP'][len(dataFrame['TIMESTAMP']) - 1]

timeDiff: timedelta = xmax - xmin
customTicks = np.linspace(0., timeDiff.seconds, 10)
fig.axes.set_xticklabels(labels=customTicks, rotation=45)
fig.axes.set_xticks(customTicks)
plt.show()
尽管如此,我还是想改变x轴:刻度太密集了,所以我希望有——比如说——10个刻度,我希望看到以分钟为单位的时间,格式为“mm:ss”

我尝试了以下方法:

fig = sns.pointplot(x='TIMESTAMP', y=acqFieldName, data=dataFrame, scale=0.75)
timestamps = dataFrame['TIMESTAMP'].dt.time

xmin = dataFrame['TIMESTAMP'][0]
xmax = dataFrame['TIMESTAMP'][len(dataFrame['TIMESTAMP']) - 1]

timeDiff: timedelta = xmax - xmin
customTicks = np.linspace(0., timeDiff.seconds, 10)
fig.axes.set_xticklabels(labels=customTicks, rotation=45)
fig.axes.set_xticks(customTicks)
plt.show()
其结果如下:

fig = sns.pointplot(x='TIMESTAMP', y=acqFieldName, data=dataFrame, scale=0.75)
timestamps = dataFrame['TIMESTAMP'].dt.time

xmin = dataFrame['TIMESTAMP'][0]
xmax = dataFrame['TIMESTAMP'][len(dataFrame['TIMESTAMP']) - 1]

timeDiff: timedelta = xmax - xmin
customTicks = np.linspace(0., timeDiff.seconds, 10)
fig.axes.set_xticklabels(labels=customTicks, rotation=45)
fig.axes.set_xticks(customTicks)
plt.show()
显然不是我想要的

如果我能减少按时间格式化的记号的数量,或者更好的是,如果点与按时间给定的记号对齐,我的问题就会得到解决

更新:Zaraki Kenpachi产量建议

    fig, ax = plt.subplots()
    ax.plot(dataFrame.set_index('TIMESTAMP'), dataFrame[acqFieldName])
    plt.show()
基于约翰回答的工作解决方案:

for fileName in glob.glob('*.csv'):
    plt.close()
    # NOTE: CsvFileProcessor is a custom class doing the readout of CSV and conversion to pandas.DataFrame
    dataFrame, acqFieldName, settingParameterCount = CsvFileProcessor.processFile(fileName)

    fig, ax = plt.subplots()
    ax: plt.Subplot = sns.pointplot(x='TIMESTAMP', y=acqFieldName, data=dataFrame, scale=0.75, ax=ax)
    startTime = dataFrame['TIMESTAMP'][0]

    timeProgress = []

    for timeStamp in dataFrame['TIMESTAMP']:
        timePassed = timeStamp - startTime
        timeProgress.append(timePassed)

    custom_ticks = range(0, len(timeProgress), 5)
    timestamps = [f"{datetime.timedelta(seconds=timeProgress[t].seconds)}" for t in custom_ticks]

    # for manipulating the x-axis tick labels:
    # https://stackoverflow.com/questions/51105648/ordering-and-formatting-dates-on-x-axis-in-seaborn-bar-plot
    ax.axes.set_xticklabels(labels=timestamps, rotation=45)
    ax.axes.set_xlabel(xlabel="Processing Time")
    plt.title('Setting Parameters: ' + str(settingParameterCount))
    ax.axes.set_xticks(custom_ticks)
    outFileName = fileName.upper()
    outFileName = outFileName.replace('_DATA.CSV', '')
    outFileName = outFileName + '_READOUT.PNG'
    fig.tight_layout()
    #plt.savefig(outFileName)
    plt.show()
结果:

尝试简单绘图:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.plot(df.set_index('TIMESTAMP'), df[acqFieldName])
plt.show()

主要的混淆来自这个Seaborn点图,它的x记号是数字0,1,2,。。。并为他们创建一些令人困惑的标签

为了得到你想要的,你可以设置每5个刻度。并为它们提供自定义标签。还添加次要记号,使每个条目都有一个记号

演示代码:

import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator
import pandas as pd
import numpy as np
import seaborn as sns

N = 30
timestamps = pd.date_range('2020-01-16 8:00:00', periods=N, freq='73s')
dataFrame = pd.DataFrame({'TIMESTAMP': timestamps, 'Y1': np.random.normal(100, 30, N), 'Y2': np.random.normal(100, 30, N)})

fig = sns.pointplot(x='TIMESTAMP', y='Y1', data=dataFrame, scale=0.75)

custom_ticks = range(0, len(dataFrame), 5) # ticks every 5
timestamps = [f"{dataFrame['TIMESTAMP'][t].minute:02}:{dataFrame['TIMESTAMP'][t].second:02}" for t in custom_ticks]

fig.axes.set_xticklabels(timestamps)
fig.axes.set_xticks(custom_ticks)
fig.axes.xaxis.set_minor_locator(AutoMinorLocator())

plt.tight_layout()
plt.show()

不。代码图,ax=plt.subplot ax.plotdataFrame.set_index'TIMESTAMP',dataFrame[acqFieldName]生成一些奇怪的图参见初始post的修改您可能是指ax.plotdataFrame['TIMESTAMP',dataFrame[acqFieldName]`@JohanC:no,我是指dataFrame.set_index'TIMESTAMP',就像Zaraki建议的那样。不,我想解释一下@Zaraki可能意味着ax.plotdataFrame['TIMESTAMP'],…发布或附加csv示例data@WolfiG我在你的帖子中添加了一些测试数据。请随时改进。非常感谢这项工作。只有一件事:您使用一种奇特的符号来生成时间戳数组。在何处/在哪个关键字下可以找到有关该语法的文档?该符号是自Python 3.6以来新出现的。通常,它们比其他将变量填充到字符串中的方法更方便、可读性更强。