Matplotlib - 在同一图上格式化两个图

时间:2013-08-30 18:34:54

标签: python matplotlib

我正在尝试绘制一些数据,但是我仍然坚持在同一个数字上绘制2个图。它看起来像这样:

enter image description here

代码是:

import re
import sqlite3
import matplotlib.pyplot as plt
from matplotlib.dates import datetime as dt
from matplotlib.dates import DateFormatter

...

for company in companies:
    cursor.execute("select distinct url from t_surv_data where company = ? order by product_type", (company,))
    urls = [r[0] for r in cursor.fetchall()]

    for idx, url in enumerate(urls):              
    cursor.execute("select price, timestamp from t_surv_data where url = ? order by timestamp", (url,))
    data = [[r[0], r[1]] for r in cursor.fetchall()]
    price, date = zip(*data)                
    date = [dt.datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in date]

    f = plt.figure('''figsize=(3, 2)''')

    ax = f.add_subplot(111)
    ax.plot(date, price) # x, y
    ax.xaxis.set_major_formatter(DateFormatter('%d\n%h\n%Y'))
    #ax.set_ylim(ymin=0) # If I use this a break the plot

    ax2 = f.add_subplot(211)
    ax2.scatter(date, [1,1,-1])
    ax2.xaxis.set_major_formatter(DateFormatter('%d\n%h\n%Y'))
    #ax2.set_ylim(ymin=-1, ymax=1) # If I use this a break the plot

    plt.savefig('plt/foo' + str(idx) + '.png')
    plt.close()

我该如何解决这个问题:

1 - 情节看起来像是一个在另一个之上。如何使用视觉格式将其格式化为在同一图上看起来像独立的图。

2 - 我正在使用这行代码来绘制“ax2.xaxis.set_major_formatter(DateFormatter('%d \ n%h \ n%Y'))”,但日期中没有同步。两个地块的日期应该相等。

有人可以给我一些关于这个问题的线索吗?

最诚挚的问候,

2 个答案:

答案 0 :(得分:3)

您没有正确使用add_subplot

ax = f.add_subplot(2,1,1)
ax2 = f.add_subplot(2,1,2)

第一个数字表示行数,第二个数字表示列数,第三个数字表示绘图的索引。

答案 1 :(得分:2)

如果希望绘图共享x轴(即带日期的轴),则必须指定sharex属性。

fig, (ax1, ax2) = plt.subplots(2, 1, sharex=True)
ax1.plot(...)
ax2.scatter(...)
ax1.xaxis.set_major_formatter(DateFormatter('%d\n%h\n%Y'))

您只需设置主格式化程序一次,因为它们共享x轴。