Один график с тремя цветными полосами внизу

Я относительно новичок в Python. Я хочу создать единый график заполненных контуров из трех цветовых полос, например: http://www.cpc.ncep.noaa.gov/products/predictions/30day/off15_temp.gif

Мне удалось создать три цветные полосы, каждая из которых имеет ту же длину, что и одна сторона графика, и разместить их слева, снизу и справа соответственно. Мой вопрос двоякий:

  1. Как изменить размер цветной полосы, чтобы она была короче одной стороны графика (мне удалось уменьшить ширину, а не длину цветной полосы. Кроме того, я могу уменьшить цветную полосу только до одной сторона сюжета)?

  2. Как расположить несколько цветных полос так, чтобы они отображались рядом в нижней части графика (мне еще не встречалось ни одного решения с более чем одной цветной полосой на одной стороне графика)?

Ниже приведена часть моего кода:

import matplotlib.pyplot as plt
import numpy as np

#import data
#lon and lat are arrays representing longitude and latitude respectively
#prob_above, prob_normal and prob_below are arrays representing the probability of above average, normal and below average temperature or precipitation occurring

clevs = np.arange(40,110,10) #percent
cs_above = plt.contourf(lon, lat, prob_above, clevs)
cs_normal = plt.contourf(lon, lat, prob_normal, clevs)
cs_below = plt.contourf(lon, lat, prob_below, clevs)

cbar_above = plt.colorbar(cs_above, location = 'left')
cbar_normal = plt.colorbar(cs_normal, location = 'bottom')
cbar_below = plt.colorbar(cs_below, location = 'right')

person Rodney C.    schedule 02.10.2018    source источник


Ответы (1)


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

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

x,y1,y2,y3 = np.random.rand(4,15)

gs = GridSpec(2,3, height_ratios=[15,1])

fig = plt.figure()
# Axes for plot
ax = fig.add_subplot(gs[0,:])
# three colorbar axes
cax1 = fig.add_subplot(gs[1,0])
cax2 = fig.add_subplot(gs[1,1])
cax3 = fig.add_subplot(gs[1,2])

# plot
sc1 = ax.scatter(x, y1, c=y1, cmap="viridis")
sc2 = ax.scatter(x, y2, c=y2, cmap="RdYlGn")
sc3 = ax.scatter(x, y3, c=y3, cmap="copper")

# colorbars
fig.colorbar(sc1, cax=cax1, orientation="horizontal")
fig.colorbar(sc2, cax=cax2, orientation="horizontal")
fig.colorbar(sc3, cax=cax3, orientation="horizontal")

plt.show()

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

person ImportanceOfBeingErnest    schedule 03.10.2018
comment
Спасибо за ваш ответ! Ваше предложение помогло ответить на мой вопрос. Кроме того, поскольку я имел дело с базовой картой, я добавил оси в качестве аргумента для базовой карты: m = Basemap(projection='merc', lat_0=0, lon_0=0, ax=ax) - person Rodney C.; 03.10.2018