【问题标题】:pyplot distance between axis and plot轴和绘图之间的pyplot距离
【发布时间】:2014-01-14 17:58:56
【问题描述】:

我正在尝试制作一个图表来显示数据库中的日常数据。我在这里为特定的一天制作了这张图。我对这里的一些细节不满意,我不知道我应该寻找什么关键字。

我拥有的是

但我希望图表看起来像(忽略颜色等):

在我的图像中,x 轴上的时间从创建第一个时间戳时开始(图像显示的那天是上午 8 点,但每天从不同的时间开始),但我希望时间总是从 7:00:00 开始.这是创建时间戳的最早时间。

其次,我想在绘图边缘和第一个/最后一个条之间留出一些空间。我不希望酒吧触及情节的边缘。

我的代码在这里。

import MySQLdb
import numpy as np
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import pandas as pd

# connect to MySQL database
conn = MySQLdb.connect(host="localhost", user="r1", passwd="!r1db!",
db="r1array")
# prepare a cursor
cur = conn.cursor()

# this is the query we'll be making
query = """SELECT TimeStamp,Pac FROM SolarData WHERE DATE(`TimeStamp`) = CURDATE()-6 GROUP BY HOUR(TimeStamp);"""

# execute the query
cur.execute(query)
# retrieve the whole result set
data = cur.fetchall()

# close cursor and connection
cur.close()
conn.close()

# unpack data in TimeStamp (x axis) and Pac (y axis)
TimeStamp, Pac = zip(*data)

# graph code
fig = plt.figure()
ax = fig.add_subplot()
plt.bar(TimeStamp, Pac, align='center', width=0.015)

# set title, X/Y labels
plt.title("PVIC R1 panel ")
plt.xlabel("Hour")
plt.ylabel("Pac")
fig = plt.gcf()
fig.set_size_inches(20.5,10.5)
plt.grid(True)
plt.draw()
fig.savefig('test.png', dpi=100)

【问题讨论】:

  • 您的图片没有通过(您没有足够的代表自行发布它们,将它们放在公开的地方,高级代表用户可以为您编辑它们)。还请包括您用于生成图形的代码。
  • 我们离一个好问题越来越近了。如果可以,请删除 SQL 语句并发布带有示例数据的 minimal 工作示例。这样我们就可以重现有问题的图片。
  • 如果你想避免事情发生在情节的边缘,也可以看看ax.margins(或等效的plt.margins)。在您的特定情况下,如果您不想让绘图始终在特定时间开始,并且只是希望自动缩放在边缘留出一些空间,ax.margins(0.05, 0) 将沿 x 方向添加 5% 的填充和零沿 y 方向填充。

标签: python matplotlib


【解决方案1】:

...我希望时间总是从 7:00:00 开始...其次,我想在情节边缘和第一个/最后一个条形之间留出一些空间。

使用plt.xlim 设置开始和结束时间。这是一个包含一些玩具数据的示例:

import datetime
import pylab as plt

# Some sample data
X = [datetime.datetime(2000, 3, 2, n) for n in xrange(9,13)]
Y = [4,8,3,2]

# Set the limits
start_time = datetime.datetime(2000, 3, 2, 7)
end_time = datetime.datetime(2000, 3, 2, 14)

plt.bar(X, Y, align='center',width=.015)
plt.gcf().autofmt_xdate()
plt.xlim(start_time, end_time)
plt.show()

【讨论】:

  • 我明白你的意思。现在我不知道如何使用 TimeStamp 格式设置 xlim 范围......你知道 TimeStamp 来自 MySQL,而不是 matplotlib 或 python 的一部分。
  • 作为您生成的图表,您的 10 a.m. 条上升到框的顶部边缘。有没有办法避免这种情况?我的意思是,将 y 轴设为 9 会更好看,这样上午 10 点的条形就不会碰到边缘。
  • @ShuruiLiu 这很简单,只需使用plt.ylim 设置yaxis 的限制。或者正如乔在 cmets 中建议的那样,使用 plt.margins 给自己一个“差距”,就像你所说的那样。
  • 我想我的问题是:我需要 y 轴自动缩放取决于最大值。所以 plt.ylim 在这里并不是一个很好的选择。 plt.margins 需要像plt.margins(x,y) 这样设置参数。如果我设置 y=0,最大条将触及绘图的顶部边缘。