2014-01-14 142 views
2

我想制作一个图表来显示数据库中的日常数据。我以前在这里为此特定的一天制作了这个图表。我对这里的一些细节并不满意,我不知道我应该寻找哪些关键词。pyplot坐标轴与坐标图之间的距离

什么我是

enter image description here

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

enter image description here

在我的形象,在X轴上时间从创建第一个时间戳的时候开始(在图像显示的早上8点,但每天从不同的时间开始),但我想要的时间总是从7:00:00开始。这是TimeStamp创建的最早时间。

其次,我想在剧情的边缘与第一个/最后一个酒吧之间留出一些空间。我不想让酒吧触及剧情的边缘。

我的代码就在这里。

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) 
+0

您的图片没有来过(你没有足够的代表张贴他们你的自我,把他们某处公共和高代表用户可以为你编辑它们)。还请包括您用于生成图形的代码。 – tacaswell

+0

我们正在接近一个很好的问题。如果可以,请删除SQL语句并发布带有示例数据的_minimal_工作示例。这样我们可以重现有问题的图片。 – Hooked

+0

如果你想避免在事件的边缘发生事情,还可以看看'ax.margins'(或者等价的,'plt.margins')。在你的具体情况下,如果你不想让剧情总是在特定的时间开始,并且只希望自动缩放在边缘留出一些空间,那么'ax.margins(0.05,0)'会添加5%的填充沿着x方向和沿着y方向的零填充。 –

回答

2

...我想的时间总是从开始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() 

enter image description here

+0

我明白你的观点。现在我不知道如何使用TimeStamp格式设置xlim范围......你知道TimeStamp来自MySQL,而不是matplotlib或python的一部分。 –

+0

按照您生成的图表,您的上午10点会上升到框的上边缘。无论如何要避免这一点?我的意思是,将y轴设置为9以使上午10点杆不会碰到边缘会更好。 –

+0

@ShuruiLiu这很简单,只需使用'plt.ylim'设置yaxis的限制。或者如乔在评论中所建议的那样,使用'plt.margins'给你自己一个“差距”,就像你说的那样。 – Hooked