繁体   English   中英

使用 Matplotlib 的颜色条刻度不匹配

[英]Mismatch in ticks of colorbar using Matplotlib

我正在绘制一个形状为(220,220)的数组Pe 使用红色圆圈突出显示的颜色条的某些刻度不匹配。 基本上,我希望颜色条上的每种颜色都有一个明确定义的最终值。 我该如何做到这一点?

import matplotlib as mpl
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np
from matplotlib.colors import Normalize
from matplotlib import cm
import math
from  numpy import nan

fig,aPe = plt.subplots(1)
n=11
arMax=[]
arMin=[]

N=2*n*(n-1)

J = np.array([[]])

Pe=np.array([[397.9245283 , 431.37280501, 423.07492578, 448.72320111,
       415.76282885, 403.98056072, 406.32617702, 439.50026536,
       398.74902582, 402.08146852, 416.21242203, 427.5394595 ,
       427.06507633, 413.08553581, 412.20075077, 437.50197698,
       437.75076871, 398.33635041, 401.03411236, 436.50963158,
       414.19687294, 439.2494816 , 413.7516213 , 401.87155987,
       430.88988181, 422.61039289, 420.07358693, 411.75977806,
       448.46178462, 403.76866504, 425.41299332, 436.26224822,
       402.92330055, 399.36964466, 437.00524093, 430.16752099,
       414.86655013, 426.59174471, 401.66187026, 418.70266927,
       438.74877169, 416.66298861, 409.56899181, 408.04926082,
       399.9921984 , 447.93986435, 429.20813236, 432.34190614,
       426.8282793 , 407.83307657, 417.34067053, 417.11453175,
       429.68729115, 438.49884457, 423.54048103, 421.91550311,
       441.01100224, 402.71251224, 427.77704651, 441.26380205,
       444.06384971, 406.9706254 , 442.78670822, 431.13120817,
       429.92727196, 435.27551245, 444.3201626 , 447.6793595 ,
       404.40501999, 413.30732589, 407.40139454, 404.83037214,
       408.69919091, 445.3483799 , 428.49139455, 434.53838488,
       434.04835195, 427.30213625, 440.75849192, 412.64266901,
       406.11181421, 412.42159151, 430.64882546, 400.20014785,
       433.07159431, 405.68376641, 411.10008524, 437.25346787,
       419.61561798, 428.2530136 , 439.75133565, 440.25433778,
       405.25662001, 433.80374971, 422.14687898, 432.8280914 ,
       442.02394342, 424.70886414, 423.77364309, 403.34553985,
       425.64822218, 424.4746721 , 405.04338393, 404.19267892,
       408.9162946 , 421.45351141, 398.54258129, 443.55211004,
       447.41915748, 410.22377598, 434.29323018, 442.27790619,
       445.60617823, 446.6403631 , 432.09922288, 420.53255663,
       436.01514511, 412.86398365, 440.00269296, 420.30294648,
       436.75729566, 418.47505247, 400.61669609, 425.17802432,
       411.53964533, 444.57677156, 438.24920203, 408.48231763,
       406.75558225, 423.3075754 , 419.38700777, 415.31420594,
       417.56705465, 428.73004103, 418.24768301, 441.77027214,
       443.29668225, 407.61712126, 414.41985832, 417.7936845 ,
       406.54076625, 424.007062  , 403.13430964, 413.9741274 ,
       401.45239937, 432.58486216, 415.09025734, 411.31974785,
       446.12267131, 398.13033286, 415.53839631, 400.40831363,
       444.83367708, 422.84253175, 422.37850877, 426.11946115,
       409.35119469, 445.86427519, 416.43758344, 429.4475781 ,
       428.01489773, 430.40803867, 440.5062706 , 402.29159657,
       446.89965981, 408.26567439, 410.44250286, 415.98750396,
       443.04154848, 416.88863791, 421.68438072, 448.20067254,
       398.95568434, 399.78446494, 399.16255717, 405.47008071,
       433.559423  , 428.96895348, 419.84447757, 411.98014641,
       405.89767746, 409.78702083, 410.66146312, 431.61467276,
       434.78381651, 410.88065712, 414.64308392, 426.35547214,
       442.53216095, 441.51689185, 410.00528209, 418.02056049,
       409.13362907, 419.15864652, 447.15925776, 420.76241778,
       400.82529555, 431.8568119 , 421.22289476, 420.99253035,
       433.31537135, 402.50194436, 446.3813671 , 438.99898387,
       418.93053382, 445.09087969, 407.18589604, 443.80783236,
       435.76832176, 435.52177769, 399.57694714, 425.88371131,
       424.94331474, 404.61758428, 437.99984357, 403.55699154,
       413.52935426, 435.02952554, 424.2407382 , 397.9245283 ]])

C1 = nan
for i in J[0]:
    Pe = np.insert(Pe, i, [C1], axis=1)
print("Pe =", [Pe])

for i in range(0,len(Pe)):
    Max=max(max(Pe[i]), max(Pe[i]))
    Min=min(min(Pe[i]), min(Pe[i]))
    
    arMax.append(Max)
    Max=np.array(arMax)
    
    arMin.append(Min)
    Min=np.array(arMin)

a=min(Min)
b=max(Max)

print("a =",a)
print("b =",b)


Amax= math.ceil(b)
Amin= math.floor(a)
print(Amax, Amin)

color = cm.get_cmap('Dark2')
norm = Normalize(vmin=Amin, vmax=Amax)
color_list = []
for i in range(len(Pe[0])):   
    color_list.append(color(((Pe[0,i])-Amin)/(Amax-Amin)))
    
id = 0
for j in range(0, n):
    for k in range(n-1):
        aPe.hlines(200+200*(n-j-1)+5*n, 200*(k+1)+5*n, 200*(k+2)+5*n, zorder=0, linewidth=5.0,colors=color_list[id])
        id += 1

    for i in range(0, n):
        rect = mpl.patches.Rectangle((200+200*i, 200+200*j), 10*n, 10*n, linewidth=1.0, edgecolor='black', facecolor='black')
        aPe.add_patch(rect)
        if j < n-1:
            aPe.vlines(200+200*i+5*n, 200*(n-1-j)+5*n, 200*(n-j)+5*n, zorder=0,linewidth=5.0, colors=color_list[id])
            id += 1

cb = fig.colorbar(cm.ScalarMappable(cmap=color, norm=norm), ticks=np.arange(Amin, Amax+len(color.colors), len(color.colors)))
cb.set_ticks(np.arange(Amin, Amax+1, (Amax-Amin)/8).astype(np.int64))
cb.set_label("Entry pressure (N/m$^{2}$)")

aPe.set_xlim(left = 0, right = 220*n)
aPe.set_ylim(bottom = 0, top = 220*n)
plt.axis('off')
plt.title("Time = 5",fontsize=20)
plt.show()

在此处输入图像描述

目前,您首先设置ticks

ticsk=np.arange(Amin, Amax+len(color.colors), len(color.colors))
# array([397, 405, 413, 421, 429, 437, 445, 453])

这仍然会产生更严重的不匹配(请注意,此数组的长度为8 ,而您正在寻找 9 个刻度标签,如下面的 arrays 中所示)。

但是你用以下内容覆盖它:

cb.set_ticks(np.arange(Amin, Amax+1, (Amax-Amin)/8).astype(np.int64))
# array([397, 403, 410, 416, 423, 429, 436, 442, 449], dtype=int64)

正如@r-beginners 的评论中所提到的,在这里您通过将浮点数转换为整数来引入不匹配。 原来的花车是:

np.arange(Amin, Amax+1, (Amax-Amin)/8)
array([397. , 403.5, 410. , 416.5, 423. , 429.5, 436. , 442.5, 449. ])

您想要做的是首先将实际浮点值传递给刻度,然后简单地调整它们的格式 例如:

tks = np.arange(Amin, Amax+1, (Amax-Amin)/8)

cb = fig.colorbar(cm.ScalarMappable(cmap=color, norm=norm), ticks=tks)
cb.set_ticklabels(['{:.0f}'.format(t) for t in tks])

# or: cb.set_ticklabels([str(int(t)) for t in tks])

结果:

彩条

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM