Matplotlib 沿对数颜色刻度的另一侧显示指数值

Matplotlib 沿对数颜色刻度的另一侧显示指数值,matplotlib,colorbar,logarithm,Matplotlib,Colorbar,Logarithm,使用水平对数缩放颜色栏和底部的记录标签,是否可以沿顶部显示指数化(原始)值 因此,在本例中,颜色栏顶部应该有记号和标签,从mat.min()=0.058到mat.max()=13.396 将matplotlib导入为mpl 将matplotlib.pyplot作为plt导入 将numpy作为np导入 mat=np.exp(np.random.randn(20,20)) 马绍公司(mat) norm=mpl.colors.Normalize(1,np.log(mat.max())) plt.col

使用水平对数缩放颜色栏和底部的记录标签,是否可以沿顶部显示指数化(原始)值

因此,在本例中,颜色栏顶部应该有记号和标签,从
mat.min()=0.058
mat.max()=13.396

将matplotlib导入为mpl
将matplotlib.pyplot作为plt导入
将numpy作为np导入
mat=np.exp(np.random.randn(20,20))
马绍公司(mat)
norm=mpl.colors.Normalize(1,np.log(mat.max()))
plt.colorbar(plt.cm.ScalarMappable(norm=norm),方位=“水平”)
plt.savefig(“rand_mat.png”,dpi=200)
以下是您的答案。我已经根据这个定制了它。这个结果符合你问题的意图吗?颜色栏和图形的大小不一样,所以我调整了它们

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(20210404)
mat = np.exp(np.random.randn(20, 20))

norm = mpl.colors.Normalize(1, np.log(mat.max()))

fig, (ax, cax) = plt.subplots(nrows=2, gridspec_kw=dict(height_ratios=[15,1],hspace=0.5))
im = ax.matshow(mat)
cbar = plt.colorbar(plt.cm.ScalarMappable(norm=norm), orientation="horizontal", cax=cax)
cax2 = cax.twiny()

cbar.ax.xaxis.set_label_position("bottom")
         
iticks = np.arange(mat.min(), mat.max(), 2)               
cax2.set_xticks(iticks)

ax_pos = ax.get_position()
cax_pos = cbar.ax.get_position()
new_size = [ax_pos.x0, cax_pos.y0, ax_pos.x1 - ax_pos.x0, cax_pos.y1 - cax_pos.y0]
cbar.ax.set_position(new_size) 

plt.show()

冒着犯错误的风险,我将用最适合我需要的解决方案回答我自己的问题:

cb.ax.secondary_xaxis(“top”,functions=(np.exp,np.log)) 给

完整代码

将matplotlib导入为mpl
将matplotlib.pyplot作为plt导入
将numpy作为np导入
mat=np.exp(np.random.randn(20,20))
马绍公司(mat)
norm=mpl.colors.Normalize(np.log(mat.min()),np.log(mat.max())
cb=plt.colorbar(plt.cm.ScalarMappable(norm=norm),方向=“水平”)
cb_ax_top=cb.ax.secondary_xaxis(“top”,functions=(np.exp,np.log))
cb_ax_top.set_xticks([0.1,0.5,1,4,10,20])

这是一个良好的开端,但上限值不正确。它们不应该线性增加,而应该指数增加。在中间的颜色实际上不对应于值6。如果你需要一个指数比例,你可以像这样修改它。code>iticks=np.logspace(np.sqrt(mat.min()),np.sqrt(mat.max()),6,base=2)