matplotlib 使用seaborn设置对数刻度中的刻度

5jvtdoz2  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(130)

我有两个带有整数值的列表,我想在python中使用seaborn并排绘制它们的两个直方图:

fig, [ax1, ax2] = plt.subplots(nrows=1, ncols=2, figsize=(16,6))

sns.set(style="whitegrid")
sns.distplot(list1, bins=30, rug=True, kde=False, ax=ax1)
sns.distplot(list2, bins=30, rug=True, kde=False, ax=ax2)
ax1.set_yscale('log')
ax2.set_yscale('log')
plt.show()

这是一个情节:

很明显,右侧图中的信息是无用的,因为柱的高度是整数。因此,我对0到1之间的数字的对数标度一点也不感兴趣,也就是说,我想去掉10^{-power}。我怎样才能强制右侧图中的标签为0、1、10、100和1000的10次幂表示法呢?就像左侧图一样。谢谢。

guykilcj

guykilcj1#

我不知道原来的y轴标度本身是无用的,没有数据的话很坚韧判断。但看起来你只是想改变y轴的标签。我可以按照herehere的指导来做:

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

# Define lists
list1 = np.random.randint(0,1000, 10000)
list2 = np.random.randint(0,1000, 10000)

fig, [ax1, ax2] = plt.subplots(nrows=1, ncols=2, figsize=(16,6))

sns.set(style="whitegrid")
sns.distplot(list1, bins=30, rug=True, kde=False, ax=ax1)
sns.distplot(list2, bins=30, rug=True, kde=False, ax=ax2)

# Alter axis labels
ax1.axes.set_yticks([0,1,10,100,1000])
ax2.axes.set_yticks([0,1,10,100,1000])
ax1.axes.set_yticklabels(['0','$\\mathdefault{10^{0}}$',
                          '$\\mathdefault{10^{1}}$','$\\mathdefault{10^{2}}$',
                          '$\\mathdefault{10^{3}}$'])
ax2.axes.set_yticklabels(['0','$\\mathdefault{10^{0}}$',
                          '$\\mathdefault{10^{1}}$','$\\mathdefault{10^{2}}$',
                          '$\\mathdefault{10^{3}}$'])
ax1.get_yaxis().get_major_formatter().labelOnlyBase = False
ax2.get_yaxis().get_major_formatter().labelOnlyBase = False

ax1.set_yscale('log')
ax2.set_yscale('log')
plt.show()
s1ag04yj

s1ag04yj2#

尽管有这样做的原因,我还是给出了一个解决问题的答案。这个想法是为y尺度设定一个限制:

ax.set_ylim([0.5, 1000])

这产生了曲线的正确行为。

相关问题