0

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

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'])

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

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

我现在想创建一个地毯图,我认为 imshow 可能是解决这个问题的一种方法,正如 imshow 的文档所说

cmap :颜色图,可选,默认值:无

如果没有,默认为 rc image.cmap 值。当 X 具有 RGB(A) 信息时忽略 cmap

所以我创建了一个新的数据框,颜色为条目:

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]]

现在我希望这可以工作:

fig,ax = plt.subplots()
im = ax.imshow(
    df_color.values, interpolation='nearest', aspect='auto')

但我得到的只是一个 TypeError: Image data can't convert to float

我期望的结果(并且能够用一个糟糕的低效代码创建应该看起来像这个地毯图的预期结果

但这只会引发 TypeError,图像数据无法转换为浮点数。

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

4

1 回答 1

1

我找到了解决我的问题的方法。假设离散颜色图可以解决问题。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()

轴的描述仍然需要一些修改,但它基本上可以工作。

于 2015-05-01T15:07:32.913 回答