首页 > 解决方案 > 将轴设置为颜色条

问题描述

我有一个变量,我们称之为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))

在此处输入图像描述 我想把这个颜色条放在我的最终情节中。有了一些代码和 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)

在此处输入图像描述

标签: pythonmatplotlibcolorbar

解决方案


Matplotlibbarh可用于在所需位置绘制颜色条。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()

结果图


推荐阅读