图形布局问题Matplolib python 3

时间:2017-09-25 08:15:08

标签: python python-3.x matplotlib tkinter

基本上,我正在根据存储在txt文件中的时间列表(HH:MM:SS,x轴)和浮点值(y轴)绘制图形,如下所示:

[15 55 15, 13.55]

我想根据上次可用时间绘制最后一个浮点值(作为注释文本标签)。使用上面的txt,我想绘制与点datefunc = lambda x: mdates.date2num(datetime.strptime(x.decode("utf-8"), '%H %M %S')) dates, levels = np.genfromtxt('sensor1Text.txt', # Data to be read delimiter=8, # First column is 8 characters wide converters={0: datefunc}, # Formatting of column 0 dtype=float, # All values are floats unpack=True) # Unpack to several variables # Configure x-ticks plot_fs1.set_xticks(dates) # Tickmark + label at every plotted point plot_fs1.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M:%S')) plot_fs1.set_ylabel('Fluid (mL)') plot_fs1.grid(True) # Format the x-axis for dates (label formatting, rotation) fs1.autofmt_xdate(rotation= 45) plot_fs1.plot_date(dates, levels, color='orange', ls='-', marker='o') 对应的“13.55 mL”。

以下是绘制我的图表的代码:

lastxValue= len(dates)-1
lastyValue= len(levels)-1

lastValue = levels[lastyValue]
lastDate = dates[lastxValue]

plot_fs1.annotate(lastValue, (lastDate,
                 lastValue),xytext=(15, 15),textcoords='offset points')
fs1.tight_layout()

这是我尝试在我上一次绘制的值上绘制注释标签:

{{1}}

这就是我得到的:

graph_added

注释未完全显示在绘图窗口内,x轴值往往相互重叠。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

为了避免为您绘制的每个点都有x轴条目,您可以使用定位器仅标记图表上的每一分钟。

其次,请避免使用tight_layout(),而是使用subplots_adjust()在您需要的地方添加额外的空格。例如:

import numpy as np
import matplotlib
import matplotlib.dates as mdates
import matplotlib.pyplot as plt

datefunc = lambda x: mdates.date2num(datetime.strptime(x.decode("utf-8"), '%H %M %S'))

dates, levels = np.genfromtxt('sensor1Text.txt',    # Data to be read
                              delimiter=8,  # First column is 8 characters wide
                              converters={0: datefunc}, # Formatting of column 0
                              dtype=float,   # All values are floats
                              unpack=True)   # Unpack to several variables

plot_fs1 = plt.gca()                
fig = plt.gcf()
p = plt.plot(dates, levels)

plot_fs1.set_xticks(dates) # Tickmark + label at every plotted point

plot_fs1.xaxis.set_major_formatter(mdates.DateFormatter('%H:%M'))
plot_fs1.xaxis.set_major_locator(matplotlib.dates.MinuteLocator())

plot_fs1.set_ylabel('Fluid (mL)')
plot_fs1.grid(True)
fig.autofmt_xdate(rotation= 45)
plot_fs1.plot_date(dates, levels, color='orange', ls='-', marker='o')

lastxValue = len(dates)-1
lastyValue = len(levels)-1

lastValue = levels[lastyValue]
lastDate = dates[lastxValue]

plot_fs1.annotate("{} mL".format(lastValue), (lastDate, lastValue), xytext=(15, 15), textcoords='offset points')
fig.subplots_adjust(bottom=0.15, right=0.85)     # Add space at bottom and right
plt.show()

这会给你一个图表:

matplotlib graph

答案 1 :(得分:0)

一种选择是使用与this question类似的方法,并使独立且线性间隔 xticks,并使用日期作为刻度的名称。

这个问题使用了条形图,但你可以用几秒钟的差异来看看你已经过了多少时间,制作你的标记间距以便覆盖整个时间,但是同样的步骤 。您在积分图中只需要你的时差(有差异间距)。 xticks以适当的间距变得更好。它还有助于为文本添加额外的空间。