Python Matplotlib-格式化同一图形上的两个绘图

Python Matplotlib-格式化同一图形上的两个绘图,python,matplotlib,Python,Matplotlib,我试图绘制一些数据,但在同一个图形上绘制两个绘图时遇到了困难。它看起来像这样: 代码是: 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 d

我试图绘制一些数据,但在同一个图形上绘制两个绘图时遇到了困难。它看起来像这样:

代码是:

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”)”),但日期中没有同步。两个图中的日期应该相等

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


致以最诚挚的问候,

您没有正确使用
添加子批次

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

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

您没有正确使用
添加子绘图

ax = f.add_subplot(2,1,1)
ax2 = f.add_subplot(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轴,因此只需设置一次主格式化程序。

如果希望绘图共享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轴,因此只需设置一次主格式化程序。

首先,对于添加子绘图,格式为
add\u子绘图(N\u行、N\u列、N\u绘图)
。因此,您的子绘图应该是
211
212
,而不是
111
211
。其次,
DateFormatter
只从绘图中获取XTICK并重新格式化它们;它只格式化现有的记号。要在两个x轴上获得相同的日期,您可以对这两个轴执行
ax.set\u xlim(start,end)
,或者让两个子批次
共享\u x
。首先检查,对于添加子图,格式为
add\u子图(N\u行、N\u列、N\u图)
。因此,您的子绘图应该是
211
212
,而不是
111
211
。其次,
DateFormatter
只从绘图中获取XTICK并重新格式化它们;它只格式化现有的记号。要在两个x轴上获得相同的日期,您可以对这两个轴执行
ax.set\u xlim(start,end)
,或者让两个子批次
共享\u x
。作为旁注签出您可以直接解压
AxesSubplot
实例:
fig,(ax1,ax2)=plt.子图(…
)。谢谢Viktor和nordev。这也是正确的。我不知道要检查谁是正确的。两者都是正确的。作为旁注,您可以直接解压
AxesSubplot
实例:
fig,(ax1,ax2)=plt.subplot(…
。谢谢Viktor和nordev。这也是正确的。我不知道要检查谁是正确的。两者都是正确的。