我使用matplotlib在tkinter应用程序中生成一个图像。数据提供一个存储时间的值(真正的应用程序数据以秒为单位打开会话以显示负载)。我试着在x轴上显示时间,在y轴上显示会话
我有一些困难,但格式化的x轴上的标签。如果您看到图像测试1,如果我为x轴指定整数,那么尽管数据为0-19,matplotlib会自动显示0,5,10,15,以保持轴整洁
如果我只是将标签分配给它,那么将显示前4个标签,而不是每5个标签。如果我重新设置TCIK和标签,我会得到每一个记号和每一个标签(这正好适合这里,但在我的真实应用程序中有太多的数据)
我的解决方案是手动计算每一个第n个记号和第n个标签,并分配那些已经起作用的值,但似乎应该有一些内置的功能来处理这类数据,就像处理整数一样
我的代码是:
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import (FigureCanvasTkAgg)
import datetime
import tkinter
def main():
x_labels = []
x = []
y = []
dt_now = datetime.datetime.now()
entries = 20
for i in range(0, entries):
newtime=(dt_now + datetime.timedelta(seconds=i)).strftime("%H:%M:%S")
x.append(i)
y.append(i/2)
x_labels.append(newtime)
root = tkinter.Tk()
fig = plt.figure(figsize=(8,8))
canvas = FigureCanvasTkAgg(fig, master=root)
canvas.draw()
ax1 = fig.add_subplot(221)
ax1.plot(x,y)
ax1.set_title('Test 1 - Original Values')
ax1.set_xlabel('Entry ID')
ax1.set_ylabel('Sessions')
ax2 = fig.add_subplot(222)
ax2.plot(x,y)
ax2.set_title('Test 2 - Labels 0,1,2,3\nExpecting labels 0,5,10,15')
ax2.set_xlabel('Entry Time')
ax2.set_ylabel('Sessions')
ax2.set_xticklabels(x_labels, rotation=90, ha='center')
ax3 = fig.add_subplot(223)
ax3.plot(x_labels,y)
ax3.set_title('Test 3 - Every label')
ax3.set_xlabel('Entry Time')
ax3.set_ylabel('Sessions')
ax3.set_xticklabels(x_labels, rotation = 90)
major_ticks = []
major_tick_labels = []
for i in range(0,entries,int(entries/5)):
major_ticks.append(x[i])
major_tick_labels.append(x_labels[i])
ax4 = fig.add_subplot(224)
ax4.plot(x,y)
ax4.set_title('Test 4 - What I''m expecting\nbut hard coded')
ax4.set_xlabel('Entry Time')
ax4.set_ylabel('Sessions')
ax4.set_xticks(major_ticks)
ax4.set_xticklabels(major_tick_labels, rotation=90, ha='center')
plt.subplots_adjust(hspace = 0.75, bottom = 0.2)
canvas.get_tk_widget().pack(side=tkinter.TOP, fill=tkinter.BOTH, expand=1)
tkinter.mainloop()
if __name__ == '__main__':
main()
这是实现要求的唯一方法还是我缺少了一些可用的东西。我已经阅读了文档,但是在那里看不到任何相关的内容(过去确保我将记号和标签放在一起)。我希望过程尽可能自动化,因为时间框架将由用户驱动,因此最好使用4个刻度、5个刻度、10个刻度等。Matplotlib似乎能很好地处理这一要求,在定义的整数范围内,我只想关联相同的标签
你可以用matplotlib.dates。注意,您需要将x\u标签的格式保持为datetimes,这样才能工作(我删除了您对.strftime的调用)
这会给你
相关问题 更多 >
编程相关推荐