pandas 如何将列的最小值和最大值显示为条格中心的x刻度

1qczuiv0  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(83)

我想在每个bin的中心显示x轴值。此外,这里的列 flipper_length_mm 的最小值和最大值应该分别显示在第一和最后。下面你可以找到我的尝试。

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

penguins = sns.load_dataset("penguins")
penguins = penguins.dropna()

max_n = penguins.flipper_length_mm.max()
min_n = penguins.flipper_length_mm.min()
bins = 15
step = (max_n - min_n) / bins
print(min_n, max_n, bins, step)
# 172.0 231.0 15 3.933333333333333

arr_div = np.arange(min_n + step / 2, max_n + step / 2, step=step)
arr_div_r = np.round(arr_div, 0).astype(int)

sns.histplot(data=penguins, x="flipper_length_mm", hue="sex", bins=bins, multiple="stack")
plt.xticks(arr_div, arr_div_r)
# To see the real values without rounding
# plt.xticks(arr_div)

plt.show()

使用上面的代码,居中的x刻度或x轴值不是 flipper_length_mm 列的最小值或最大值。我想将最小值显示为172,最大值显示为231。如何实现这一点?

km0tfn4u

km0tfn4u1#

您可以使用次要刻度在开始和结束处添加2个特殊刻度位置。使它们更大可以避免与现有(主要)刻度重叠,并强调它们的间距不同。您还可以选择更改它们的颜色。当x轴标签被最大刻度移动时,将其填充设置为负值可以避免多余白色。
(Note由于浮点精度问题,np.arange(start, stop, step)有时可能包含stop值。下面的代码在max_n处使用stop值,以确保滴答停止得更早。)

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

penguins = sns.load_dataset("penguins")
penguins = penguins.dropna()

max_n = penguins.flipper_length_mm.max()
min_n = penguins.flipper_length_mm.min()
bins = 15
step = (max_n - min_n) / bins

arr_div = np.arange(min_n + step / 2, max_n, step=step)
arr_div_r = np.round(arr_div, 0).astype(int)

ax = sns.histplot(data=penguins, x="flipper_length_mm", hue="sex", bins=bins, multiple="stack")
ax.set_xticks(arr_div, arr_div_r)
ax.set_xticks([min_n, max_n], [round(min_n), round(max_n)], minor=True)
ax.tick_params(axis='x', which='minor', length=14, color='b', labelcolor='b')
ax.xaxis.labelpad = -4
ax.margins(x=0)
sns.despine()
plt.tight_layout()
plt.show()

相关问题