Участок квадратной формы в сочетании с подзаголовком, общая ось x

#matplotlib

#matplotlib

Вопрос:

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

Конечный результат должен выглядеть следующим образом:

Требуется решение с квадратным участком и дополнительным вторым участком

Как мне получить график в этой форме?

Ответ №1:

Идея состоит в том, чтобы потребовать фиксированного figsize и дополнительного к этому использования a GridSpec , которое работает в рамках данного figsize , чтобы убедиться, что пространство используется так, как мы этого хотим.

Следующая часть генерирует квадратный график и меньший подзаголовок с фиксированным height_ratio соотношением 3: 1. Причина в figsize том, что мы хотим иметь квадрат (который определяет width размер фигуры 3 и высоту 4 ( =3 1 как указано в соотношении высот).).

 fig = plt.figure(figsize=(3, 4)) 
gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1])
  

Решение с помощью hspace-gap

Чтобы сократить разрыв между подзаголовками, мы знаем, что задаем дополнительный параметр hspace=0 .

 fig = plt.figure(figsize=(3, 4)) 
gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1], hspace=0)
  

Решение без hspace-gap

Полный рабочий пример может выглядеть следующим образом:

 import pylab as plt    
import numpy as np
from matplotlib.ticker import MaxNLocator
import matplotlib.gridspec as gridspec

fig = plt.figure(figsize=(3, 4)) 
gs = gridspec.GridSpec(2, 1, height_ratios=[3, 1],hspace=0)

# generate some random test data
datatemp = np.random.random_sample((100,2))
datatemp2 = np.random.random_sample((100,2))*np.array([1,2])

ax0 = plt.subplot(gs[0])
ax0.scatter(*datatemp.T)
ax1 = plt.subplot(gs[1],sharex=ax0)
ax1.scatter(*datatemp2.T)

ax0.grid(True)
ax1.grid(True)

ax0.set_xlim(0,1)
ax0.set_ylim(0,1)

ax1.set_ylim(0,2)

# cosmetics 
ax1.axes.get_yaxis().set_major_locator(MaxNLocator(prune='upper'))
ax1.set_yticks(np.arange(0,2,0.5))

plt.setp(ax0.get_xticklabels(), visible=False)