绘制具有对数着色的离散,块状2D matplotlib图

时间:2012-10-24 03:14:02

标签: python matplotlib colorbar

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

经过大量的修修补补,我已经能够完成我想要的任务。 它不是一个快速的代码,因为它绘制了超过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

我知道我可以使用以下方法更新ticklabels:

cbar.ax.set_yticklabels(new_ticks)

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

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

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

非常感谢任何帮助,这一直在我的脑海中。

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

enter image description here

编辑:

我还创建了数据的hexbin图,因为你可以看到它非常非常粗糙并且通常很麻烦。

enter image description here

概括上述问题。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

经过大量的修修补补,我已经能够完成我想要的任务。 它不是一个快速的代码,因为它绘制了超过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()

这能够成功构建我想要的绘图,它会自动执行颜色条并对其进行适当的格式化。