首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >用对数着色绘制离散的、块状的2D matplotlib图

用对数着色绘制离散的、块状的2D matplotlib图
EN

Stack Overflow用户
提问于 2012-10-24 03:14:02
回答 1查看 1.2K关注 0票数 2

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

经过多次修修补补,我终于能够完成我想要的事情了。这并不是一段快速的代码,因为它绘制了超过17,000个独立的条形图。

解决方案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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)中将对数颜色映射合并到一系列堆叠的条形图中。本质上,每个“堆栈”值都有一个二级值,我对其应用对数变换,然后将其用作颜色映射的一部分。

有两个循环用于创建绘图:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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),并将这些值显示在颜色栏上。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cbar.ax.get_yticklabels() # This gets text values, not floats
cbar.ax.get_yticks() # This gets the positions

我知道我可以使用以下命令更新ticklabel:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cbar.ax.set_yticklabels(new_ticks)

但是,我想要一种通用的方法来获取滴答值,以便进行转换。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。因此,我不确定轮廓图是否适用于这里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-01 01:47:36

经过多次修修补补,我终于能够完成我想要的事情了。这并不是一段快速的代码,因为它绘制了超过17,000个独立的条形图。

解决方案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13042471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文