Показывает только последний подплот (остальные пустые), и это неправильный сюжет - PullRequest
0 голосов
/ 08 июля 2019

У меня проблемы с настройкой подзаговоров в matplotlib.Ниже приведен скриншот макета, который я пытаюсь достичь.Я прошел только через ax4, так как столкнулся с двумя проблемами.Код также ниже.(Обратите внимание, что сами по себе функции отображаются должным образом.) Я хочу продолжить использовать «subplot2grid» вместо других опций, и я использую Python 2.7

Ожидаемое поведение: Графики ax1, ax2 и ax3 должны быть картой рельефа оттенков мира, положение которой показано на желаемой схеме ниже.График ax4 должен быть точечным графиком с положением, как показано на желаемой схеме ниже.

Фактическое поведение: Графики ax1, ax2 и ax3 все пустые График ax4 не является точечным, ноэто на самом деле карта;макет также неправильный.

Я думал, что мне не хватает функции типа "Hold On", но похоже, что это не так, как работает matplotlib .Я также убедился, что я определил пределы графика в функции myplotA.

import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
from mpl_toolkits.basemap import Basemap
from random import randint

def myplotA(plotnum, title):
    south = 34.0129656032
    north = 34.721878622
    west = -116.7615176
    east = -116.336918412
    center = [(east + west) / 2, (north + south) / 2]
    m = Basemap(llcrnrlon=west, llcrnrlat=south, urcrnrlon=east, urcrnrlat=north, resolution='c', epsg=4326, lon_0=center[0], lat_0=center[1], suppress_ticks=False)
    img = m.arcgisimage(service="World_Shaded_Relief", xpixels=2000)
    img.set_alpha(0.5)
    plt.xticks(rotation='horizontal')
    plotnum.xaxis.set_major_formatter(ScalarFormatter(useOffset=False))
    plotnum.axis([west, east, south, north])
    for label in (plotnum.get_xticklabels() + plotnum.get_yticklabels()):label.set_fontsize(9)
    plt.gca().set_title(title, fontsize=12)

def myplotB(plotnum, title):
    x = [randint(0, 10) for i in range(0, 6)]
    y = [randint(0, 10) for i in range(0, 6)]
    plotnum.scatter(x, y, s=4)
    plotnum.xaxis.set_major_formatter(ScalarFormatter(useOffset=False))
    plt.xlabel('xlabel', fontsize=8)
    plt.ylabel('ylabel', fontsize=8)
    plt.gca().set_title(title, fontsize=12)



fig = plt.figure(figsize=(11, 17))
ax1 = plt.subplot2grid((8, 3), (0, 0), rowspan=4, colspan=1)
ax2 = plt.subplot2grid((8, 3), (0, 1), rowspan=4, colspan=1)
ax3 = plt.subplot2grid((8, 3), (0, 2), rowspan=4, colspan=1)
ax4 = plt.subplot2grid((8, 3), (5, 0), rowspan=1, colspan=2)
myplotA(ax1, 'ax1')
myplotA(ax2, 'ax2')
myplotA(ax3, 'ax3')
myplotB(ax4, 'ax4')
plt.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=.1, hspace=.1)
fig.savefig(outpath + '\\' + 'mytest.pdf')

Требуемый макет Требуемый макет изображения

Фактический результат Фактический результат Image

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Спасибо @ ImportanceOfBeingErnest

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

fig = plt.figure(figsize=(11, 17))
ax1 = plt.subplot2grid((8, 3), (0, 0), rowspan=4, colspan=1)
myplotA(ax1, 'ax1')
ax2 = plt.subplot2grid((8, 3), (0, 1), rowspan=4, colspan=1)
myplotA(ax2, 'ax2')
ax3 = plt.subplot2grid((8, 3), (0, 2), rowspan=4, colspan=1)
myplotA(ax3, 'ax3')
ax4 = plt.subplot2grid((8, 3), (4, 0), rowspan=1, colspan=2)
myplotB(ax4, 'ax4')
plt.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=.1, hspace=.1)
fig.savefig(outpath + '\\' + 'mytest.pdf')

Ссылка на изображение выходного графика;выглядит как положено

0 голосов
/ 08 июля 2019

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

import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter
from mpl_toolkits.basemap import Basemap
from random import randint

def myplotA(ax, title):
    south = 34.0129656032
    north = 34.721878622
    west = -116.7615176
    east = -116.336918412
    center = [(east + west) / 2, (north + south) / 2]
    m = Basemap(llcrnrlon=west, llcrnrlat=south, urcrnrlon=east, urcrnrlat=north, 
                resolution='c', epsg=4326, lon_0=center[0], lat_0=center[1], 
                suppress_ticks=False, ax=ax)
    img = m.arcgisimage(service="World_Shaded_Relief", xpixels=2000)
    img.set_alpha(0.5)
    plt.setp(ax.get_xticklabels(), rotation='horizontal')
    plt.setp(ax.get_xticklabels() + ax.get_yticklabels(), fontsize=9)
    ax.xaxis.set_major_formatter(ScalarFormatter(useOffset=False))
    ax.axis([west, east, south, north])
    ax.set_title(title, fontsize=12)

def myplotB(ax, title):
    x = [randint(0, 10) for i in range(0, 6)]
    y = [randint(0, 10) for i in range(0, 6)]
    ax.scatter(x, y, s=4)
    ax.xaxis.set_major_formatter(ScalarFormatter(useOffset=False))
    ax.set_xlabel('xlabel', fontsize=8)
    ax.set_ylabel('ylabel', fontsize=8)
    ax.set_title(title, fontsize=12)



fig = plt.figure(figsize=(11, 8))
ax1 = plt.subplot2grid((8, 3), (0, 0), rowspan=4, colspan=1)
ax2 = plt.subplot2grid((8, 3), (0, 1), rowspan=4, colspan=1)
ax3 = plt.subplot2grid((8, 3), (0, 2), rowspan=4, colspan=1)
ax4 = plt.subplot2grid((8, 3), (5, 0), rowspan=1, colspan=2)
myplotA(ax1, 'ax1')
myplotA(ax2, 'ax2')
myplotA(ax3, 'ax3')
myplotB(ax4, 'ax4')
plt.subplots_adjust(left=0.1, bottom=0.1, right=0.9, top=0.9, wspace=.1, hspace=.1)
fig.savefig('mytest.pdf')
plt.show()

enter image description here

...