matplotlib 如何在Pandas图中使用对数标尺

9ceoxa92  于 2023-04-06  发布在  其他
关注(0)|答案(3)|浏览(121)

我用pandas做了一个相当简单的直方图

results.val1.hist(bins=120)

这很好,但我真的想在y轴上有一个对数刻度,我通常(可能不正确)这样做:

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
plt.plot(np.random.rand(100))
ax.set_yscale('log')
plt.show()

如果我用pandas命令替换plt命令,那么我有:

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
results.val1.hist(bins=120)
ax.set_yscale('log')
plt.show()

导致同一错误的多个副本:

Jan  9 15:53:07 BLARG.local python[6917] <Error>: CGContextClosePath: no current point.

我确实得到了一个对数刻度直方图,但它只有条的顶部线条,但没有垂直条或颜色。是做了什么可怕的错误,还是这只是不支持的Pandas?
从Paul H的代码中,我添加了bottom=0.1hist调用修复了这个问题,我猜有某种除以零的东西,或者其他东西。

7cwmlq89

7cwmlq891#

我建议在pyplot hist函数中使用log=True参数:
设置步骤

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt  

df = pd.DataFrame({'column_name': np.random.normal(size=2000)})

使用pyplot

plt.hist(df['column_name'], log=True)

或者等价地,你可以直接使用dataframe列(series)的plot方法:

df["column_name"].plot(kind="hist", logy=True)

还有logx用于对x轴进行对数缩放,loglog=True用于对两个轴进行对数缩放。

enxuqcxy

enxuqcxy2#

没有任何数据很难诊断。以下方法对我有效:

import numpy as np
import matplotlib.pyplot as plt
import pandas
series = pandas.Series(np.random.normal(size=2000))
fig, ax = plt.subplots()
series.hist(ax=ax, bins=100, bottom=0.1)
ax.set_yscale('log')

这里的关键是将ax传递给直方图函数,并指定bottom,因为对数尺度上没有零值。

0mkxixxg

0mkxixxg3#

Jean PA的解决方案是这个问题最简单,最正确的一个。写这个作为答案,因为我没有代表评论。
为了直接从pandas构建直方图,一些参数无论如何都会传递给matplotlib.hist方法,所以:

results.val1.hist(bins = 120, log = True)

会生产出你需要的东西。

相关问题