我对在python
中进行图形绘制非常陌生,并且在创建子图时遇到了麻烦。
我目前有一个循环,该循环将产生2个数组,然后将它们分配给Dataframe列并在图形上使用df.plot()
。这导致我每次循环都得到不同的图。
我想尝试将所有内容放到一个情节中。我在循环之外创建了Figure对象,并在循环中尝试了以下代码。我知道我需要定义子图的大小,但是问题是循环数是用户定义的。另外,关于形状-如果是4个循环,则2x2会很好,但如果是25,则id希望它尽可能地逼近一个正方形。不确定这是否可行。
ax = plt.subplot(i)
ax.scatter(y_df['y_pred'], y_df['y_test'])
但是我一直收到以下错误:
“三位数,而不是{}”。format(args [0]))
ValueError:整数子图规范必须为三位数 数字,而不是1
这是我的完整代码。我删除了许多不相关的行,以使其易于理解:
fig = plt.figure()
tscv = TimeSeriesSplit(n_splits=self.no_splits)
for train_index, test_index in tqdm(tscv.split(X)):
X_train, X_test = X.iloc[train_index], X.iloc[test_index]
y_train, y_test = y.iloc[train_index], y.iloc[test_index]
self.regressor.fit(X_train, y_train.ravel())
# predict y values
y_pred = self.regressor.predict(X_test)
# plot y_pred vs y_test
y_df = pd.DataFrame()
y_pred = y_pred.reshape(len(y_pred), )
y_test = y_test.reshape(len(y_test), )
y_df['y_pred'] = y_pred
y_df['y_test'] = y_test
ax = plt.subplot(i)
ax.scatter(y_df['y_pred'], y_df['y_test'])
答案 0 :(得分:2)
add_subplot具有三个参数:
fig.add_subplot(nrows, ncols, index)
如果要更新子图的分配位置,可以在各个轴上使用“ change_geometry”,该轴采用相同的三个参数,例如:
for i,ax in enumerate(fig.axes):
if isinstance(ax,matplotlib.axes.SubplotBase):
ax.change_geometry(len(fig.axes),1,i)
我使用“ change_geometry”做了一个小例子:
import matplotlib.pyplot as plt
from matplotlib.widgets import Slider
import numpy as np
import random
def run(val):
n_axes = int(val)
ax_names = random.sample(range(max_size),n_axes)
i=0
for ax_name in range(1,max_size):
# Delete outdated axes
if ax_name not in ax_names and ax_name in my_axes.keys():
fig.delaxes(my_axes[ax_name])
del my_axes[ax_name]
if ax_name in ax_names:
i+=1
#Plot new data on new axes
if ax_name not in my_axes.keys():
print(i,n_axes)
y = np.random.rand(x.shape[0])
my_axes[ax_name] = ax = fig.add_subplot(n_axes,1,i)
ax.plot(x,y)
# Relocate "old" ax to new position
else:
my_axes[ax_name].change_geometry(n_axes,1,i)
fig = plt.figure()
my_axes = {}
x = np.linspace(0,1,100)
max_size=81
ax = plt.axes([0.1, 0.03, 0.8, 0.03], facecolor='#cccc00')
sNum = Slider(ax, '#plots', 1, max_size, valinit=1, valstep=1)
sNum.on_changed(run)