如何根据箱形图中的中值分配颜色?
How to assign colors according to median value in box plot?
我的箱形图的调色板有问题。我希望根据中值分配颜色。中值越高,颜色越深。我选择了调色板 YlGnBu
。但是,颜色的分配只是作为渐变 - 较深的颜色在右侧,而较浅的颜色在左侧:
df = sns.load_dataset("tips")
norm = plt.Normalize(df["total_bill"].values.min(), df["total_bill"].values.max())
colors = plt.cm.YlGnBu(norm(df["total_bill"]))
flierprops = dict(markerfacecolor='0.75', markersize=5,linestyle='none')
plt.figure(figsize=(12,8))
ax = sns.boxplot(x="day", y="total_bill", data=df,
palette=colors,
flierprops=flierprops) # hue="smoker",
plt.xticks(rotation='vertical')
ax.get_xaxis().set_major_formatter(
matplotlib.ticker.FuncFormatter(lambda x,p: str(x)+":00"))
ax.get_yaxis().set_major_formatter(
matplotlib.ticker.FuncFormatter(lambda x,p: locale.format('%d', x, 1)))
ax.grid(b=True, which='major', color='#d3d3d3', linewidth=1.0)
ax.grid(b=True, which='minor', color='#d3d3d3', linewidth=0.5)
plt.show()
您的问题是您根据数据框中 total_bill
值的整个范围设置了颜色图。如果您希望颜色图反映一周中每一天的中值,则必须使用这些中值进行设置。
df = sns.load_dataset("tips")
median_vals = df.groupby('day')['total_bill'].median()
norm = plt.Normalize(median_vals.min(), median_vals.max())
colors = plt.cm.YlGnBu(norm(median_vals))
plt.figure(figsize=(12,8))
ax = sns.boxplot(x="day", y="total_bill", data=df, palette=colors)
plt.show()
我的箱形图的调色板有问题。我希望根据中值分配颜色。中值越高,颜色越深。我选择了调色板 YlGnBu
。但是,颜色的分配只是作为渐变 - 较深的颜色在右侧,而较浅的颜色在左侧:
df = sns.load_dataset("tips")
norm = plt.Normalize(df["total_bill"].values.min(), df["total_bill"].values.max())
colors = plt.cm.YlGnBu(norm(df["total_bill"]))
flierprops = dict(markerfacecolor='0.75', markersize=5,linestyle='none')
plt.figure(figsize=(12,8))
ax = sns.boxplot(x="day", y="total_bill", data=df,
palette=colors,
flierprops=flierprops) # hue="smoker",
plt.xticks(rotation='vertical')
ax.get_xaxis().set_major_formatter(
matplotlib.ticker.FuncFormatter(lambda x,p: str(x)+":00"))
ax.get_yaxis().set_major_formatter(
matplotlib.ticker.FuncFormatter(lambda x,p: locale.format('%d', x, 1)))
ax.grid(b=True, which='major', color='#d3d3d3', linewidth=1.0)
ax.grid(b=True, which='minor', color='#d3d3d3', linewidth=0.5)
plt.show()
您的问题是您根据数据框中 total_bill
值的整个范围设置了颜色图。如果您希望颜色图反映一周中每一天的中值,则必须使用这些中值进行设置。
df = sns.load_dataset("tips")
median_vals = df.groupby('day')['total_bill'].median()
norm = plt.Normalize(median_vals.min(), median_vals.max())
colors = plt.cm.YlGnBu(norm(median_vals))
plt.figure(figsize=(12,8))
ax = sns.boxplot(x="day", y="total_bill", data=df, palette=colors)
plt.show()