创建具有离散值的地毯图

时间:2015-05-01 13:05:53

标签: python matplotlib imshow

我想创建一个具有离散值的地毯图。例如,我有这些值:

point: {
  events: {
    click: function (e) {
      var conditionalContent = condition == met ? 'conditional content' : '';
      maincontentText: 'normal content ' + conditionalContent
    }
  }
}

我还有一个字典可以将这些离散值与颜色匹配:

import pandas as pd
import pylab as plt
df_data = pd.DataFrame(
    [[1, 2, 1], [1, 1, 3], [2, 2, 5], [3, 2, 1]], index=['n1', 'n2', 'n3', 'n4'], columns=['var1', 'var2', 'var3'])

我现在想创建一个地毯情节,我认为imshow可以成为解决这个问题的方法,因为imshow的文档说

  

cmap:Colormap,可选,默认值:无

     

如果为None,则默认为rc image.cmap值。当X具有RGB(A)信息

时,忽略 cmap

所以我创建了一个新的Dataframe,其颜色为条目:

    matcher_dict = {
    1: (236, 99, 92), 2: (75, 129, 196), 3: (244, 153, 97), 5: (135, 104, 180)}

现在我希望这可行:

df_color = pd.DataFrame(index=df_data.index, columns=df_data.columns)
for col_index, col in enumerate(df_data.iteritems()):
    for row_index, value in enumerate(col[1]):
        df_color.ix[row_index].ix[col_index] = matcher_dict[
            df_data.ix[row_index].ix[col_index]]

但我得到的只是一个TypeError:图像数据无法转换为float

我期望的结果(能够使用可怕的低效代码创建的结果应该如下所示Expected Result of the carpetplot

但这只会引发TypeError,Image数据无法转换为float。

编辑:如果我直接使用df_data.values(而不是df_color.values,它会使用默认的colormap创建一个绘图。是否可以创建一个离散的colormap?(我没有完全理解来自的色彩图概念)阅读matplotlibs文档)

1 个答案:

答案 0 :(得分:1)

我找到了解决问题的方法。假设一个离散的色彩图就可以了。如何创建一个在a scipy cookbook中描述,搜索discrete_cmap。

所以我的工作代码是这样的:

import pandas as pd
import pylab as plt
df_data = pd.DataFrame(
[[1, 2, 1], [1, 1, 3], [2, 2, 5], [3, 2, 1]], index=['n1', 'n2', 'n3', 'n4'], columns=['var1', 'var2', 'var3'])
cpool = ['#EC635C', '#4B81C4', '#F49961', '#B45955',
     '#8768B4']
cmap3 = plt.matplotlib.colors.ListedColormap(cpool[0:5], 'indexed')

fig, ax = plt.subplots()
im = ax.imshow(
df_data.values, cmap=cmap3, interpolation='nearest', aspect='auto')
plt.colorbar(mappable=im)

plt.show()

Axes描述仍然需要一些fiddeling,但它基本上是有效的。