在循环中添加动态大小的子图

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (9)

我很想绘图python并且我在创建子图时遇到了麻烦。

我目前有一个循环,它将产生2个数组,然后我将其分配给Dataframe列并用于df.plot()图形。这导致我在循环中每次都获得不同的图。

我想尝试将所有内容都放在一个地块上。我在循环之外创建了图形对象,在循环中,我尝试了下面的代码。我知道我需要定义子图的大小,但问题是用户定义的循环数。另外,关于形状 - 如果它是4个循环,2x2就可以了,但是如果它是25,那么我想尝试尽可能地近似一个正方形。不确定这是否可行。

        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'])
提问于
用户回答回答于

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)

热门问答

SCF 服务中运行 puppeteer 缺少中文字体?

推荐已采纳

您好,这个功能正在发布中,烦请持续关注~

腾讯云通信SDK接入问题?

人生的旅途辣鸡前端
推荐
您好,为了进一步优化管理通知,Google在发布android 8 时对通知做了修改优化,出现了通知渠道功能。具体可以参考以下文章: https://www.jianshu.com/p/8baa62c5bfc2 如有其它异常,可联系QQ3268519604 感谢您对云通信的支持与...... 展开详请

急急急!!核验图片验证码填写到接入备案企业侧备案系统中,在哪操作啊?

无聊至极互联网重度用户
推荐
你反馈的上海备案的APP核验验证码吗?如果是的话,提交订单的时候直接写验证码就可以的。 在补充材料的下面 image.png ... 展开详请

存储桶和项目概念?

Hyman.W

腾讯云 · 高级产品经理 (已认证)

推荐
一个存储桶对应多个项目的管理方式,可以使用 “标签” 来管理, 在创建存储桶或者修改存储桶配置的页面可以添加。 参考: 1,存储桶标签使用 https://cloud.tencent.com/document/product/436/34830 2,如果需要通过外部系统来管理...... 展开详请

智能钛能处理大数据文件吗?我有30G的数据存储在本地电脑硬盘上?

腾讯智能钛AI开发者

腾讯云 · 智能钛产品团队 (已认证)

腾讯智能钛产品团队官方运营账号。分享产品最新动态,第一时间解答用户疑问。
推荐

硬盘可以升级吗?

最爱开车啦互联网的敏感者
推荐

可以升级,小微活动中没有云硬盘的的,后续可以用同帐号在官网购买和服务器同地域同地区的云硬盘挂载到服务器上使用。

云硬盘挂载初始化方法 可参考 https://cloud.tencent.com/document/product/362/6735

所属标签

扫码关注云+社区

领取腾讯云代金券