Можно ли с помощью matplotlib создать график, показанный на прилагаемом рисунке?

1

Я хочу построить серию линейных графиков на сетке подсети, используя matplotlib. Однако верхняя правая часть сетки является повторением нижнего левого угла, поэтому я хочу оставить верхний правый угол. Я прилагаю png-образ того, что я ищу. Можно ли сделать что-то подобное с помощью matplotlib?

Было бы также полезно, чтобы оси были помечены, но с использованием подзаголовков это не сложно.

Изображение 174551

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

Код, который я использую в данный момент, может быть не так полезен, чтобы смотреть, но это то, что я использовал для создания полной сетки 4 на 4, я бы хотел сделать 4 на 4, а верхний правый блок остался без внимания. Обратите внимание, что если я не буду строить некоторые ячейки сетки, я все равно буду показывать оси, возможно, я смогу превратить очертания осей для этих подсетей?

plt.subplots(4,4,figsize=(9,6))
slist = ['S1', 'S2', 'S3', 'S4']
count = 1
for i in range (4):
    for j in range (4):       
        r.reset()
        m = r.simulate (0, 80, 2000, [slist[i], slist[j]])
        plt.subplot (4,4,count)
        plt.plot (m[:,0], m[:,1])
        count += count
plt.show()

Следующая строка вызывает симулятор, который возвращает два столбца для выбранных в данный момент переменных. Это неэффективно, поскольку я мог бы быть, потому что я действительно должен называть его один раз со всеми переменными, а затем выделять те, которые я хочу на каждом сюжете. Но это был всего лишь прототип для экспериментов с графикой. Оптимизация может произойти позже. Переменная r является ссылкой на simulstor.

m = r.simulate (0, 80, 2000, [slist[i], slist[j]])

Я только что открыл это:

  ax = plt.subplot (4,4,count)
  plt.plot (m[:,0], m[:,1])
  if count in [2,3,4,7,8,12]:
     ax.set_visible(False)

Это просто, но нужно будет обобщить.

Окончательный код, который хорошо работает и основан на ответе Кота Мори, который также включает маркировку осей:

slist = ['S1', 'S2', 'S3', 'S4']
m = r.simulate (0, 80, 2000, slist)
fig = plt.figure(figsize=(9,6))
fig.tight_layout() 
count = 0
for i in range(4):
    for j in range(4):
        count += 1
        if i >= j:
           ax = fig.add_subplot(4, 4, count)
           ax.set_xlabel (slist[i])
           ax.set_ylabel (slist[j])
           ax.plot (m[:,i], m[:,j])
  • 0
    Не могли бы вы поделиться своим кодом, чтобы мы могли там помочь?
  • 0
    Я только добавил еще один комментарий и код, который я сейчас использую
Теги:
matplotlib

2 ответа

3
Лучший ответ

Вы можете использовать add_subplot чтобы добавить только те ячейки, которые вам нужны.

fig = plt.figure(figsize=(9, 6))

count = 0
for i in range(4):
    for j in range(4):
        count += 1
        if i >= j:
            ax = fig.add_subplot(4, 4, count)
            ax.text(0.5, 0.5, str(count))
  • 0
    работает add_subplot
0

Можете ли вы попробовать это?

plt.subplots(4,4,figsize=(9,6))
slist = ['S1', 'S2', 'S3', 'S4']
for i in range (4):
    for j in range (4): 
        if i>=j:
          pos = i*4+j+1
          r.reset()
          m = r.simulate (0, 80, 2000, [slist[i], slist[j]])
          plt.subplot (4,4,pos)
          plt.plot (m[:,0], m[:,1])
plt.show()
  • 1
    Это частично работает, но оно строит оси для отсутствующих ячеек сетки. Я сталкивался с этим: ax.set_visible (False), который будет скрывать оси.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню