Matplotlib итеративно устанавливает размер оси субплота - PullRequest
0 голосов
/ 28 ноября 2018

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

Я создаю подзаголовки итеративно, поэтому я не знаю заранее ширину каждого из них (он вычисляется ПОСЛЕ вызова вызывается plt.subplots ()), что означает, что я не могу установить размер каждого подзаговоракогда я их изначально создаю.Я хотел бы установить размер оси x субплота после того, как он уже был создан.

Представьте себе что-то вроде:

items = [A,B,C]  #this could have any number of items in it
f,ax = plt.subplots(len(items),1, figsize=(10,10)) #figsize is arbitrary and could be anything

for i in range(len(items)):
    #calculate x and y data for current item
    #calculate width of x axis for current item
    plt.sca(ax[i])
    cax = plt.gca()
    cax.plot(x,y)
    #here is where I would like to set the x axis size
    #something like cax.set_xlim(), but for the size, not the limit

Примечание 1. Единицы значения не имеют, а относительный размер имеет значение, поэтому это может быть размер в пикселях, сантиметрах или даже соотношениерассчитывается на основе относительной ширины.

Примечание 2. Ширина оси x в этом случае НЕ связана с пределом x, поэтому я не могу просто установить предел x и ожидать, что ось будет масштабироваться правильно.

Кроме того, я стараюсь, чтобы этот код был коротким, поскольку он должен быть доступен людям, незнакомым с Python, поэтому, если единственное решение заключается в добавлении нескольких строк, оно того не стоит, и я будужить с неправильно масштабированными осями.Это эстетическое предпочтение, но не требование.Спасибо!

РЕДАКТИРОВАТЬ: Вот к чему я стремлюсь desired subplots

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете создать новый GridSpec, указав height_ratios, а затем обновить каждую позицию ax s:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

# create figure
f, ax = plt.subplots(3, 1, figsize=(10,10))

# plot some data
ax[0].plot([1, 2, 3])
ax[1].plot([1, 0, 1])
ax[2].plot([1, 2, 20])

# adjust subplot sizes
gs = GridSpec(3, 1, height_ratios=[5, 2, 1])
for i in range(3):
    ax[i].set_position(gs[i].get_position(f))

plt.show()

Я задавал похожий вопрос перед здесь .Вариант использования был немного другим, но он все еще может быть полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...