我正在尝试遍历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行) 2)另一段1和2的代码(每个图在X Y和Z中有3行)
我试图遍历字母列表和数字列表,因为我的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()
但是我一直收到错误,我认为索引编制是错误的..所以卡住了。有什么想法吗?
预期输出为: fig1 1x3子图,其中绘制了x1和x2,y1和y2,z1和z2 图2 1x2子图,其中绘制了x1,y1和z1,并绘制了x2,y2和z2
谢谢
答案 0 :(得分:1)
获得所需输出的一种方法是:
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 ...]。您可能需要研究pandas multiindex来构建一个数据框,在其中可以自动提取必要的信息。