上下文
我有一个包含聚集数据的pandas-DataFrame
,我想将其绘制为条形图:
df = pd.DataFrame({
"x_axis": np.arange(0., 1., .01)
, "counts": some_aggregation
})
# df looks like this
x_axis |counts
--------------
0.00 | 1.0
0.01 | 0.0
0.02 | 14.0
...
1.00 | 12.0
可以看到,这提供了
x_axis
:一列,我希望使用它来提供x轴,因为计数可以包含zero-valuescounts
,这是来自一个组的聚合,我希望通过它在x_axis
.中绘制所提供的发行版。
对于seaborn
或matplotlib
本身,可以很容易地将其可视化:
s = sns.barplot(x='x_axis', y="counts", data=df)
问题
当我绘制所描述的图表时,X-滴答被matplotlib
转换为matplotlib
,因为在x_axis
中提供的分发是作为分类数据处理的。打印挠痒痒标签显示了以下问题:
list(s.get_xticklabels())
# Output
[Text(0, 0, '0.0'),
Text(1, 0, '0.01'),
Text(2, 0, '0.02'),
...
]
当然,通过执行以下操作,我可以将x-ticklabels设置为正确的位置:
# Change x-axis-position of x-tick-labels
s.set_xticks(s.get_xticks() * .01)
# Output
[Text(0.0, 0, '0.0'),
Text(0.01, 0, '0.01'),
Text(0.02, 0, '0.02'),
...
]
无论如何,虽然勾标本身现在处于正确位置,但图表本身并没有更新以显示新放置标签上方的条形图。
问题
我可以做一个to选项:
sns.barplot
的“范畴”标度转换为度量尺度?这将是我最喜欢的解决方案,因为我实际上希望与范围为set_xlim((0., 1.))
.s.set_xticks(s.get_xticks() * .01)
?匹配。
发布于 2021-07-01 14:52:52
您可以使用sns.histplot()
,通过weights
和显式地在x-值之间设置bin边界:
from matplotlib import pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
xs = np.arange(0., 1., .01)
df = pd.DataFrame({"x_axis": xs,
"counts": np.random.randint(0, 10, len(xs))})
fig = plt.figure(figsize=(16, 4))
ax = sns.histplot(data=df, x="x_axis", weights="counts", bins=np.arange(-0.005, 1, 0.01))
ax.margins(x=0.005) # the default margins left and right are too large
ax.set_xticks(xs)
ax.tick_params(axis='x', labelrotation=90)
fig.tight_layout()
plt.show()
为了有更多的标准x-滴答,ax.set_xticks(xs)
和旋转可以被忽略.
还请注意,"np.arange(0.,1.,.01)“可能具有欺骗性。由于它与浮动一起工作,取决于舍入错误,最终的1.0
可能包括在内,也可能不包括。处理这一问题的一种方法是使端点值更大(如果您想包含它,例如np.arange(0, 1.0001, .1)
),或者更小(只提前停止一个值)。也可以将数字创建为整数,然后再进行除法(np.arange(0, 100)/100
)。
https://stackoverflow.com/questions/68214891
复制