最终编辑(部分解决方案):
经过多次修修补补,我终于能够完成我想要的事情了。这并不是一段快速的代码,因为它绘制了超过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
我知道我可以使用以下命令更新ticklabel:
cbar.ax.set_yticklabels(new_ticks)
但是,我想要一种通用的方法来获取滴答值,以便进行转换。
返回的文本值的当前格式为:
Text(1,0,u'\u22121.6') # Corresponds to -1.6 in unicode (I think).
任何帮助都将不胜感激,这已经让我头疼不已。
最后,它应该看起来像这样(注意,我已经手动调整了这些刻度值,轴标签已经被删除,因为它们不重要)
编辑:
我还创建了一个数据的六边形图,正如您所看到的,它非常不稳定,处理起来通常很混乱。
来概括上面的问题。
(表示法,z=元素,Z=向量数组等)
我有一个具有两个唯一索引(x,y)的数据数组Z。
我想将z的每个值绘制在它的两个索引(x,y)指定的位置。Z应该是对数着色的。我想另外要一个色条来绘制这个图。理想情况下,应该填充空格,类似于第一个堆叠条形图。
注意,X是一个从1.0到48.0的整数数组(尽管类型是浮点数)。然而,Y是一个无约束的浮点数,没有顺序将每个值链接到X。因此,我不确定轮廓图是否适用于这里。
发布于 2012-11-01 01:47:36
经过多次修修补补,我终于能够完成我想要的事情了。这并不是一段快速的代码,因为它绘制了超过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()
这能够成功地构建我想要的绘图,它会自动生成颜色条并适当地格式化它。
https://stackoverflow.com/questions/13042471
复制相似问题