我有这个代码:
import numpy as np, matplotlib.pyplot as plt, seaborn as sns
fig = plt.figure(1)
sns.set(style="whitegrid", color_codes=True)
data=departments.value_counts()[:10]
pal = sns.color_palette("Blues_d", len(data))
rank = data.argsort().argsort()
sns.barplot(y=data.index, x=data, palette=np.array(pal[::1])[rank])
plt.title("Top departments", y=1.02)
fig.savefig('Top_departments', bbox_inches='tight', dpi=300)我的数据如下所示:
Chemistry 19
Computer Science 13
Physics 10
Epidemiology and Biostatistics 8
Psychology 8
Mechanical and Industrial Engineering 8
Sociology 7
Academic 7
Bioengineering 7
Biochemistry and Molecular Genetics 6附图。问题是,我得到了不同深浅蓝色的条形图,例如:社会学,学术和生物工程,而它们应该是相同的深浅,因为它们有相同的数值。

发布于 2021-11-19 00:08:15
问题的代码似乎将顺序颜色列表从大到小分配给值。当遇到ex aequo时,顺序没有明确定义,但该方法总是分配不同的颜色,尽管这些值是相等的。这种方法似乎意味着在条形图尚未排序且所有值都不同的情况下,按从高到低的顺序对条形图进行着色。
下面是一种按值显示颜色的方法:
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
fig = plt.figure(1)
sns.set(style="whitegrid", color_codes=True)
data = pd.Series([19, 13, 10, 8, 8, 8, 7, 7, 7, 6],
index=['Chemistry', 'Computer Science', 'Physics', 'Epidemiology and Biostatistics',
'Psychology', 'Mechanical and Industrial Engineering', 'Sociology',
'Academic', 'Bioengineering', 'Biochemistry and Molecular Genetics'])
cmap = sns.color_palette("Blues_d", as_cmap=True)
norm = plt.Normalize(data.min(), data.max())
sns.barplot(y=data.index, x=data, palette=cmap(norm(data.values)))
plt.title("Top departments", y=1.02)
plt.tight_layout()
plt.show()

要将条从深到亮进行着色,您可以直接使用反转的调色板,而无需使用argsort
pal = sns.color_palette("Blues_r_d", len(data))
sns.barplot(y=data.index, x=data, palette=pal)
plt.title("Top departments", y=1.02)

https://stackoverflow.com/questions/70027819
复制相似问题