2014-03-01 52 views
2

我有一个关于如何使用colormapping(cmap)绘制数据并将其转换为rgba值的具体实现问题。从本质上讲,我有一堆数据,我想创建一个errorbar()图,点的位置以及错误条本身被其他值的大小着色(具体地说,让我们假设它是对卡方的贡献一些模型的合适)。假设我有一个名为D的(N,4)数组,其中前两列是X和Y数据,第三列是错误栏的值,最后一列是它对卡方函数的贡献。cmap to rgba in Matplotlib

我该如何去做1)将卡方贡献值的范围映射到cmap,其次,2)如何从这些值中获得rgba值以便循环显示errorbar()函数以绘制我希望能够策划什么?

这实际上可能有帮助(http://matplotlib.org/api/cm_api.html),但我找不到任何示例或有关如何使用ScalarMappable()(其中有一个to_rgba()方法)的其他信息。

谢谢!

回答

3

您可以通过调用值为matplotlib.cm中的对象将标量值映射到颜色映射。该值应该在0和1之间骗因此,要获得,RGBA值一些卡方分布的数据(我将随机产生),我会做:

chisq = np.random.chisquare(4, 8) 
chisq -= chisq.min() 
chisq /= chisq.max() 
errorbar_colors = cm.winter(chisq) 

而是具有色标开始和以最小和最大实际值结束时,可以减去最小值并除以所需的最大值。

现在errorbar_colors将是一个(8, 4)阵列RGBA值从winter颜色表:

array([[ 0.  , 0.7372549 , 0.63137255, 1.  ], 
     [ 0.  , 0.7372549 , 0.63137255, 1.  ], 
     [ 0.  , 0.4745098 , 0.7627451 , 1.  ], 
     [ 0.  , 1.  , 0.5  , 1.  ], 
     [ 0.  , 0.36078431, 0.81960784, 1.  ], 
     [ 0.  , 0.47843137, 0.76078431, 1.  ], 
     [ 0.  , 0.  , 1.  , 1.  ], 
     [ 0.  , 0.48627451, 0.75686275, 1.  ]]) 

要绘制这样,你可以遍历的颜色和数据点,绘制errorbars:

heights = np.random.randn(8) 
sem = .4 

for i, (height, color) in enumerate(zip(heights, errorbar_colors)): 
    plt.plot([i, i], [height - sem, height + sem], c=color, lw=3) 
plt.plot(heights, marker="o", ms=12, color=".3") 

enter image description here

但是,内置的matplotlib颜色映射都不是全部非常适合这项任务。对于一些改进,可以使用seaborn生成一个顺序调色板可用于彩色线条:即使在这里

import numpy as np 
import seaborn 
import matplotlib.pyplot as plt 
from matplotlib.colors import ListedColormap 

chisq = np.random.chisquare(4, 8) 
chisq -= chisq.min() 
chisq /= chisq.max() 

cmap = ListedColormap(seaborn.color_palette("GnBu_d")) 
errorbar_colors = cmap(chisq) 

heights = np.random.randn(8) 
sem = .4 

for i, (height, color) in enumerate(zip(heights, errorbar_colors)): 
    plt.plot([i, i], [height - sem, height + sem], c=color, lw=3) 
plt.plot(heights, marker="o", ms=12, color=".3") 

enter image description here

但是,我怀疑,这将是最好的方式以表达您的观点。我不确切知道你的数据是什么样的,但我会建议制作两张图,其中一张带有因变量,你将在这里绘图,另一张以卡方统计量作为因变量。或者,如果您对误差线的大小和卡方值之间的关系感兴趣,我会直接用散点图进行绘图。

+0

优秀的回应!感谢这篇文章。我最终想出了另一种方法来做到这一点。 – astromax