使用循环在python中进行子打印

使用循环在python中进行子打印,python,pandas,matplotlib,Python,Pandas,Matplotlib,我试图在df上循环以在子图中绘制一些数据。我的数据列是一个字母加上一个整数 df = {'x1': [2, 4, 7, 5, 6], 'x2': [2, 7, 2, 6, 3], 'y1': [4, 3, 2, 8, 7], 'y2': [2, 2, 4, 6, 4], 'z1': [2, 2, 2, 6, 7], 'z2': [3, 1, 4, 5, 9]} df = pd.DataFrame(df, index=range(0,5)) le

我试图在df上循环以在子图中绘制一些数据。我的数据列是一个字母加上一个整数

df = {'x1': [2, 4, 7, 5, 6],
     'x2': [2, 7, 2, 6, 3],
     'y1': [4, 3, 2, 8, 7],
     'y2': [2, 2, 4, 6, 4],
     'z1': [2, 2, 2, 6, 7],
     'z2': [3, 1, 4, 5, 9]}
df = pd.DataFrame(df, index=range(0,5))

letterlist=['x', 'y', 'z']
numberlist=['1', '2']
tickers = df.columns
其中df的索引是我的df中的一组日期

我试图实现两个方面的目标: 1) A、B和C的一段代码(每个图中有两行) 2) 1和2的另一段代码(每个绘图将有3行in、X、Y和Z)

我试图循环查看字母列表和数字列表,因为我的df要大得多:

所以我尝试:

fig = plt.figure(figsize=(8,8))

for ticker, num in zip(tickers, xrange(1,len(letterlist))):
        ax = fig.add_subplot(len(letterlist),1,num)
        ax.plot(df[ticker])
        ax.set_title(ticker)

plt.tight_layout()
plt.show()
但是我不断地犯错误,我认为我的指数化是错误的。。所以被卡住了。有什么想法吗

预期输出为: 图1 1x3子地块,绘制x1和x2,y1和y2,以及z1和z2 图2 1x2子地块,绘制x1、y1和z1,以及x2、y2和z2


谢谢

实现所需输出的一种方法是:

from matplotlib import pyplot as plt
import pandas as pd
#define the dataframe
df = {'x1': [2, 4, 7, 5, 6],
     'x2': [2, 7, 2, 6, 3],
     'y1': [4, 3, 2, 8, 7],
     'y2': [2, 2, 4, 6, 4],
     'z1': [2, 2, 2, 6, 7],
     'z2': [3, 1, 4, 5, 9]}
df = pd.DataFrame(df, index=range(0,5))

letters = 3
numbers = 2
tickers = df.columns

#first figure letterwise presentation
fig, axes = plt.subplots(nrows = letters, ncols = 1, figsize=(8,8))

for i, pair in enumerate([tickers[i:i+numbers] for i in range(0, len(tickers), numbers)]):
    ax = axes[i]
    for item in pair:
        ax.plot(df[item], label = item)
    ax.legend()
    ax.set_title(", ".join(pair))
plt.tight_layout()

#second figure numberwise presentation
fig, axes = plt.subplots(nrows = numbers, ncols = 1, figsize=(8,8))

for i, pair in enumerate([tickers[i::numbers] for i in range(numbers)]):
    ax = axes[i]
    for item in pair:
        ax.plot(df[item], label = item)
    ax.legend()
    ax.set_title(", ".join(pair))
plt.tight_layout()

plt.show()
样本输出:


但是您仍然需要手动定义,您有多少个字母和数字,以及您的列必须按预期顺序[x1、x2、x3、…、xn、y1、y2、y3、…、yn、z1……]排列。您可能希望研究如何构造一个数据帧,在其中可以自动提取必要的信息

数一数你的妄想症。谢谢高雄,我更新了问题。抱歉,我不够清楚-我的问题是,我不知道如何创建所需输出中描述的新子批次。。。我的代码返回x1、x2、y1、y2、z1和z2的子批,这不是期望的输出。有什么想法吗?@T先生,这不仅仅是一个打字错误。(很抱歉,我的虚拟问题有一个小错误)。请看我上面的评论。你能帮忙吗?我不知道如何重新打开问题,我在运行代码时没有看到任何错误。但如果你只创造一个数字,就不可能得到两个数字。您不需要重新打开问题。@Goyo,谢谢您的回答。以上是我试图先解决问题的一个片段。您将看到,代码生成一个输出x1,绘制在子地块1上,而x2绘制在子地块2上。我想要的是1x3子图,x1和x2标在sub1上,y1和y2标在sub2上,z1和z2标在Sub3上谢谢你,T先生,我确实会研究多重索引,谢谢你