繁体   English   中英

使用 dataframe 制作箱线图时如何设置 y 比例

[英]How to set y-scale when making a boxplot with dataframe

我有一列分布非常大的数据,因此我在绘制和可视化它之前对它进行 log2 转换。 这工作正常,但我似乎无法弄清楚如何将 y 比例设置为 2 的指数值(相反,我只有指数本身)。

df['num_ratings_log2'] = df['num_ratings'] + 1
df['num_ratings_log2'] = np.log2(df['num_ratings_log2'])
df.boxplot(column = 'num_ratings_log2', figsize=(10,10))

在此处输入图像描述

作为比例,我想要 1 (2^0), 32 (2^5), 1024 (2^1)... 而不是 0, 5, 10...

我希望 plot 的其他所有内容保持不变。 我怎样才能做到这一点?

您可以创建一个普通箱线图,然后在 y 轴上设置一个对数刻度( ax.set_yscale('log')symlog也表示零),而不是获取数据的日志。 要获得 2 的幂(而不是 10 的幂)的刻度,请使用以 2 为ScalarFormatter LogLocator值显示为常规数字(而不是 2 10等幂)。 次要刻度的NullLocator会抑制不需要的额外刻度。

import matplotlib.pyplot as plt
from matplotlib.ticker import ScalarFormatter, LogLocator, NullLocator
import pandas as pd
import numpy as np

np.random.seed(123)
df = pd.DataFrame({'num_ratings': (np.random.pareto(10, 10000) * 800).astype(int)})
ax = df.boxplot(column='num_ratings', figsize=(10, 10))
ax.set_yscale('symlog')  # symlog also allows zero
# ax.yaxis.set_major_formatter(ScalarFormatter())  # show tick labels as regular numbers
ax.yaxis.set_major_formatter(lambda x, p: f'{int(x):,}')
ax.yaxis.set_minor_locator(NullLocator())  # remove minor ticks
plt.show()

以对数刻度为底的 boxlplot 2

希望你在下面寻找,

代码

ax = df.boxplot(column='num_ratings_log2', figsize=(20,10))
ymin = 0
ymax = 20
ax.set_ylim(2**ymin, 2**ymax)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM