Python 使热图matplotlib seaborn中的colorbar值为整数

Python 使热图matplotlib seaborn中的colorbar值为整数,python,matplotlib,seaborn,colorbar,Python,Matplotlib,Seaborn,Colorbar,我试图使我的色条有整数值而不是小数,但是编码这比预期的要困难得多 我的初始代码 import pandas as pd import matplotlib.pyplot as plt import numpy as np import seaborn as sns #sns.set() # read data revels_data = pd.read_csv("revels2.txt") rd = revels_data revels = rd.pivot("Flavour", "Pac

我试图使我的色条有整数值而不是小数,但是编码这比预期的要困难得多

我的初始代码

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns

#sns.set()

# read data
revels_data = pd.read_csv("revels2.txt")
rd = revels_data

revels = rd.pivot("Flavour", "Packet number", "Contents")

# orders flavours 
revels.index = pd.CategoricalIndex(revels.index, categories=["orange", "toffee", "chocolate", "malteser", "raisin", "coffee"])
revels.sortlevel(level=0, inplace=True)

# Draw a heatmap with the numeric values in each cell
ax = sns.heatmap(revels, annot=True, fmt="d", linewidths=0.4, cmap="YlOrRd")

ax.set_title('REVELS PACKET COUNT HEATMAP', weight="bold")

plt.show()
产生

试图从这里逆向工程一个答案

通过添加以下代码

cmap = plt.get_cmap("YlOrRd", np.max(rd.Contents)-np.min(rd.Contents)+1)
plt.get_cmap("YlOrRd", np.max(rd.Contents)-np.min(rd.Contents)+1)

# set limits .5 outside true range
mat = plt.matshow(rd.Contents, cmap=cmap, vmin = np.min(rd.Contents)-.5, vmax = np.max(rd.Contents)+.5)
plt.matshow(rd.Contents ,cmap=cmap, vmin = np.min(rd.Contents)-.5, vmax = np.max(rd.Contents)+.5)

#tell the colorbar to tick at integers
cax = plt.colorbar(mat, ticks=np.arange(np.min(rd.Contents),np.max(rd.Contents)+1))
plt.colorbar(mat, ticks=np.arange(np.min(rd.Contents),np.max(rd.Contents)+1))
但是获取错误,即ValueError:没有足够的值来解包


我想我可能应用了错误的代码,希望您能提供帮助。

下面是一个完整的工作示例,它为seaborn热图创建了一个离散的色条,并将整数值作为色条刻度


我厌倦了没有空位-(发布此问题时可能不是这样,但可以使用cbar_kws-
cbar_kws={'label':'Count','ticks':[1,3,5,7,9,11]}
指定刻度值。
import pandas as pd
import numpy as np; np.random.seed(8)
import matplotlib.pyplot as plt
import seaborn.apionly as sns
plt.rcParams["figure.figsize"] = 10,5.5

flavours=["orange", "toffee", "chocolate", "malteser", "raisin", "coffee"]
num = np.arange(0, 6*36).astype(int) % 36
flavs = np.random.choice(flavours, size=len(num))
conts = np.random.randint(0,6, len(num)).astype(int)

df = pd.DataFrame({"Packet number":num ,"Flavour":flavs,"Contents" : conts})

revels = pd.pivot_table(df, index=["Flavour"], columns=["Packet number"], values="Contents", aggfunc=np.sum) 
revels.index = pd.CategoricalIndex(revels.index, categories=flavours)
revels.sortlevel(level=0, inplace=True)
revels= revels.fillna(0)


ticks=np.arange(revels.values.min(),revels.values.max()+1 )
boundaries = np.arange(revels.values.min()-.5,revels.values.max()+1.5 )
cmap = plt.get_cmap("YlOrRd", revels.values.max()-revels.values.min()+1)
ax = sns.heatmap(revels, annot=True, linewidths=0.4, cmap=cmap,
        cbar_kws={"ticks":ticks, "boundaries":boundaries})

ax.set_title('REVELS PACKET COUNT HEATMAP', weight="bold")

plt.tight_layout()
plt.show()