Настройка оси в качестве цветовой шкалы - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть переменная, назовем ее Ecozone (синий разброс). Я хочу построить их в одном сюжете. Для Ecozone я хочу попробовать что-то более сложное. Вместо разброса я хочу иметь цветную полосу (положение цветной полосы: вдоль оси x, где-то между -5 до 0 [левая ось y]). И каждый уникальный номер представляет свой цвет. Чтобы упростить процесс, я вставил массив и цвет ниже:

>>Ecozone.shape
Output: (169,)
>>Ecozone_unique = np.unique(Ecozone)[~np.isnan(np.unique(Ecozone))]
>>Ecozone_unique
Output: array([ 85., 101., 228., 349., 402., 417., 448., 461., 576., 636., 722.,
       756., 798., 831.])
color = ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f', 
         '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928', '#8c510a', '#bf812d']
# Thus one color for each individual value
color_sel = []
for value in Ecozone:
    for i in range(0,Ecozone_unique.shape[0]):
        if value == Ecozone_unique[i]:
            color_sel.append(color[i])
        else:
            continue

Я поместил каждое значение в отдельный цвет в color_sel. (Код для color_sel может быть предоставлен при необходимости)

#Below is the code for colorbar
import matplotlib as mpl
mpl.rcParams.update({'font.size': 15})
hfont = {'fontname':'Arial'}
fig=plt.figure(figsize=(15,3))
ax=fig.add_subplot(111)
vals=Ecozone_unique
cmap = mpl.colors.ListedColormap(np.array(color_sel))
cb = mpl.colorbar.ColorbarBase(ax, cmap=cmap,
                                spacing='uniform',
                                orientation='horizontal',
                                extend='neither',
                                ticks=vals)

cb.set_label('Ecozones', **hfont)
ax.set_position((0.1, 0.45, 0.8, 0.1))

enter image description here Я хочу поместить эту цветную полосу в мой окончательный график. С некоторым кодом и Навыки Power Point, мой окончательный сюжет должен понравиться ниже.

fig, ax1 = plt.subplots(figsize = (15,6))
ax2 = ax1.twinx() 
ax1.scatter(np.linspace(0,S_r_yhat_BESS.shape[0]-1,S_r_yhat_BESS.shape[0]+1), Ecozone)
ax1.set_ylim(-50,900)

enter image description here

1 Ответ

1 голос
/ 06 апреля 2020

Matplotlib's barh можно использовать для рисования цветовой полосы в нужных местах. color_sel может быть создано с помощью поиска по словарю.

import numpy as np
from matplotlib import pyplot as plt

Ecozone_unique = np.array([85., 101., 228., 349., 402., 417., 448., 461., 576., 636., 722., 756., 798., 831.])
Ecozone = np.random.choice(Ecozone_unique, 169)
color = ['#a6cee3', '#1f78b4', '#b2df8a', '#33a02c', '#fb9a99', '#e31a1c', '#fdbf6f',
         '#ff7f00', '#cab2d6', '#6a3d9a', '#ffff99', '#b15928', '#8c510a', '#bf812d']
color_dict = {zone: col for zone, col in zip(Ecozone_unique, color)}
color_sel = [color_dict[zone] for zone in Ecozone]

fig, ax1 = plt.subplots(figsize=(15, 6))
# ax1.scatter(np.linspace(0,S_r_yhat_BESS.shape[0]-1,S_r_yhat_BESS.shape[0]+1), Ecozone)
ax1.scatter(np.linspace(0, len(Ecozone), 100), np.random.randint(1, 17, 100) * 50)
ax1.set_xlim(0, len(Ecozone))
ax1.set_ylim(-50, 900)
ax1.barh(0, height=-50, align='edge', width=1, left=np.arange(0, len(Ecozone)), color=color_sel)

plt.show()

resulting plot

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