我们的目标是用不同颜色的“?”来标记每一个酒吧。类似的问题之前已经被问过了,但它并没有解决我在这里面临的问题。
How to color a single bar based off name
%matplotlib inline
import pandas as pd
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns
data=[['a','a','b'],[20,'?',18],['?','?','f'],['?','f','f'],['a','a','?']]
col_with_missting_values=['A1','A2','A3']
df=pd.DataFrame(data,columns=col_with_missting_values)
def color(coln):
if coln=='?':
return 'b'
else:
return 'r'
fig, axes = plt.subplots(1, len(col_with_missting_values), figsize=(20, 5))
for colname, ax in zip(col_with_missting_values, axes):
(
cr:=[color(x) for x in df[colname]],
sns.countplot(df, x=f"{colname}", ax=ax, palette=cr),
ax.set_xticklabels(ax.get_xticklabels(), rotation=90),
)
字符串
每一个有“?”的条形图都应该是蓝色的,但实际上不是,而A2中的f是蓝色的,这也是错误的。
的数据
2条答案
按热度按时间4uqofj5v1#
这个问题是因为你将一种颜色Map到一列中的每个值,但是一个值可能会出现多次。例如,如果你在
cr:=[color(x) for x in df[colname]]
中硬编码A2
,你会看到结果是['r', 'b', 'b', 'r', 'r']
。但是,你只有3个条,所以只使用前3个颜色值。这就是为什么你看到
A2
的f
显示为蓝色。如果我们只使用列的唯一值来创建颜色图,那么列的颜色就像你期望的那样。将
cr:=[color(x) for x in df[colname]]
更改为cr:=[color(x) for x in df[colname].unique()],
结果:
n3schb8v2#
palette
而不传递hue
是不推荐的,所以最好用pandas.DataFrame.melt
将字符串转换为长格式,并为颜色添加一列,这为palette
和hue
提供了一列,以便轻松创建dict
。sns.catplot
和kind='count'
的打印更容易。*在
python v3.12.0
,pandas v2.1.2
,matplotlib v3.8.1
,seaborn v0.13.0
中测试。字符串
的数据
dfm.head()
型
palette
型