Skip to main content
 首页 » 编程设计

python之使用对数着色绘制离散的 block 状二维 matplotlib 图

2025年05月04日8zhwl

最终编辑(部分解决方案):

经过大量修改后,我已经能够完成我想要的。 这不是一段快速的代码,因为它绘制了超过 17,000 个单独的条形图。

解决方案

X = np.array(xvals) 
Y = np.array(yvals) 
Z = np.array(zvals) 
Y_bot = np.array(bottomvals) 
 
fig = plt.figure() 
ax = fig.add_subplot(111) 
 
jet = plt.get_cmap('jet') 
 
log_norm = colors.LogNorm() 
 
for x,y,z,bot in zip(X,Y,Z,Y_bot): 
    log_z = np.log10(z)/np.log10(max(Z)) 
    colour = jet(log_price) 
    ax.bar(x,y,bottom=bot, width=1, edgecolor='none',color=c_col) 
 
a = np.vstack((Z,Z)) 
im = plt.imshow(a, aspect='auto', cmap=jet, origin='lower', norm=log_norm) 
im.set_visible(False) 
plt.colorbar(format='%.1f') 
plt.axis([values]) 
plt.show() 

这能够成功构建我想要的图,它会自动生成颜色条并适本地格式化它。

----开始原始问题----

我正在尝试将对数颜色图合并到 matplotlib (python 2.7) 中的一系列堆叠条形图中。本质上,每个“堆栈”值都有一个次要值,我对其应用对数变换,然后将其用作颜色图的一部分。

有两个循环运行以创建情节:

import matplotlib.pyplot as plt 
import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.cm as cm 
import matplotlib.colors as colors 
import matplotlib.colorbar as cb 
import matplotlib.ticker as tk     
 
for i in range(1,x): 
    # get data for point i 
    for n, j in enumerate(data): 
        cval = log10(secondary value) 
        plt.bar(i,j, bottom=sum(j[:n]), color=cm.jet(cval) 
 
# Once it has all been plotted I want to set axis, titles and set up a color bar 
# To set up the color bar I'm currently using 
 
im = plt.imshow(a, aspect='auto',cmap=jet, origin='lower') 
im.set_visible(False) 
cbar = plt.colorbar() 

现在,问题是这些值是日志更改值(这是正确的,因为这是我一直用来绘制数据的值)。

但是,我想执行反向转换(例如 10 ** x)并将那些值显示在颜色条上。

到目前为止,我已经尝试使用:

cbar.ax.get_yticklabels() # This gets text values, not floats 
cbar.ax.get_yticks() # This gets the positions 

我知道我可以使用以下方法更新滴答标签:

cbar.ax.set_yticklabels(new_ticks) 

但是,我想要一种通用的方式来获取刻度值以进行转换。

返回的文本值的当前格式是:

Text(1,0,u'\u22121.6') # Corresponds to -1.6 in unicode (I think). 

如有任何帮助,我将不胜感激,这一直让我费尽心思。

最后它应该看起来像这样(注意,我已经手动调整了这些刻度值,轴标签已被删除,因为它们不重要)

编辑:

我还创建了数据的 hexbin 图,如您所见,它非常非常 block 状,通常处理起来很乱。

概括上述问题。

(符号,z = 元素,Z = 向量数组等)

我有一个包含两个唯一索引 (x, y) 的数据数组 Z。

我想在由其两个索引 (x, y) 指定的位置绘制 z 的每个值。 z 应该以对数方式着色。我还想用这个图绘制一个颜色条。理想情况下,应填充空格,类似于第一个堆叠条形图。

请注意,X 是一个整数数组(虽然类型是 float ),范围从 1.0 到 48.0。 然而,Y 是一个不受约束的 float ,没有顺序将每个值链接到 X。因此我不确定等高线图是否适用于此。

请您参考如下方法:

经过大量修改后,我已经能够完成我想要的。 这不是一段快速的代码,因为它绘制了超过 17,000 个单独的条形图。

解决方案

X = np.array(xvals) 
Y = np.array(yvals) 
Z = np.array(zvals) 
Y_bot = np.array(bottomvals) 
 
fig = plt.figure() 
ax = fig.add_subplot(111) 
 
jet = plt.get_cmap('jet') 
 
log_norm = colors.LogNorm() 
 
for x,y,z,bot in zip(X,Y,Z,Y_bot): 
    log_z = np.log10(z)/np.log10(max(Z)) 
    colour = jet(log_price) 
    ax.bar(x,y,bottom=bot, width=1, edgecolor='none',color=c_col) 
 
a = np.vstack((Z,Z)) 
im = plt.imshow(a, aspect='auto', cmap=jet, origin='lower', norm=log_norm) 
im.set_visible(False) 
plt.colorbar(format='%.1f') 
plt.axis([values]) 
plt.show() 

这能够成功构建我想要的图,它会自动生成颜色条并适本地格式化它。