Несколько рисунков с подзаголовками с использованием списка комбинаций в Matplotlib

#matplotlib #combinations #subplot

#matplotlib #комбинации #подзаголовок

Вопрос:

Я хочу создать потоковую диаграмму векторного поля, которое содержит некоторые свободные константы, которые я хотел бы изменить. Итак, я создал комбинации этих констант и могу успешно отображать графики потока один за другим с помощью этого:

 Y, X = np.mgrid[-1:10:200j, 0:10:200j]

tau_x = [0.01, 0.1, 1., 10.]
tau_y = [0.01, 0.1, 1., 10.]
alpha = [0.01, 0.1, 1., 10.]
r = [0.1, 0.01, 0.001]
K = [0.1, 0.5, 1.0, 1.5]

combinations_list = list(itertools.product(tau_x,tau_y,alpha,r,K))

for a in combinations_list:

    (tau_x, tau_y, alpha, r, K) = a

    Fx = (1/tau_x) * ( (-8/3)*(2*r-alpha)*(X-1)   K*X )
    Fy = (2/(tau_y*X**(3/2))) * ( -2*(Y-1)   3*Y*(X-1)/X   K*X*Y )

    fig, ax = plt.subplots()
    strm = ax.streamplot(X, Y, Fx, Fy, linewidth=0.5)

    plt.show()
  

Теперь, поскольку мы говорим об очень большом количестве комбинаций, я хотел бы создать рисунок с подзаголовками (скажем, по 9 на каждый рисунок, но могло бы быть и больше), что значительно сократило бы количество рисунков.

Примечание: Мне интересно видеть один рисунок каждый раз, и именно поэтому plt.show() находится внутри цикла, чтобы избежать открытия всех рисунков сразу.

РЕДАКТИРОВАТЬ: Следуя важности самого простого предложения, я изменил код на

 Y, X = np.mgrid[-1:10:200j, 0:10:200j]

tau_x = [0.01, 0.1, 1., 10.]
tau_y = [0.01, 0.1, 1., 10.]
alpha = [0.01, 0.1, 1., 10.]
r = [0.1, 0.01, 0.001]
K = [0.1, 0.5, 1.0, 1.5]

combinations_list = list(itertools.product(tau_x,tau_y,alpha,r,K))
length = len(combinations_list)

N = 9 #number of subplots per figure

for i in range(0,100):

    subset = combinations_list[9*i:9*i 9]

    fig = plt.figure()

    j = 1
    for a in subset:

        (tau_x, tau_y, alpha, r, K) = a

        Fx = (1/tau_x) * ( (-8/3)*(2*r-alpha)*(X-1)   K*X )
        Fy = (2/(tau_y*X**(3/2))) * ( -2*(Y-1)   3*Y*(X-1)/X   K*X*Y )

        ax = fig.add_subplot(3,3,j)
        ax.streamplot(X, Y, Fx, Fy, linewidth=0.5)
          j


    plt.show()
  

но он отображает только первый из каждого подмножества и странным образом с цветами в векторах.

Комментарии:

1. Вы можете использовать два цикла. Один выбирает подмножество комбинаций, которые вы хотите отобразить на рисунке, другой перебирает это подмножество и выводит каждый из них на свой собственный подзаголовок.

2. @ImportanceOfBeingErnest Я выполнил ваше предложение, как вы можете видеть в разделе РЕДАКТИРОВАНИЕ, но все еще возникают проблемы…

Ответ №1:

Вы не обновляете j правильно. j не обновляет значение j . Ваш код будет работать нормально, если вы замените его j на j = 1 или j = j 1 . Оба они эквивалентны.

 for i in range(0,100):
    subset = combinations_list[9*i:9*i 9]
    fig = plt.figure()

    j = 1
    for a in subset:
        (tau_x, tau_y, alpha, r, K) = a

        Fx = (1/tau_x) * ( (-8/3)*(2*r-alpha)*(X-1)   K*X )
        Fy = (2/(tau_y*X**(3/2))) * ( -2*(Y-1)   3*Y*(X-1)/X   K*X*Y )

        ax = fig.add_subplot(3,3,j)
        ax.streamplot(X, Y, Fx, Fy, linewidth=0.5)
        j  = 1 # <--- change here
  

введите описание изображения здесь