想要将 Pandas 数据框绘制为具有 log10 比例 x 轴的多个直方图

Posted

技术标签:

【中文标题】想要将 Pandas 数据框绘制为具有 log10 比例 x 轴的多个直方图【英文标题】:Want to plot Pandas Dataframe as Multiple Histograms with log10 scale x-axis 【发布时间】:2015-07-07 22:45:42 【问题描述】:

我在 Pandas 数据框中有浮点数据。每列代表一个变量(它们具有字符串名称),每行代表一组值(行具有不重要的整数名称)。

>>> print data
0      kppawr23    kppaspyd
1      3.312387   13.266040
2      2.775202    0.100000
3    100.000000  100.000000
4    100.000000   39.437420
5     17.017150   33.019040
...

我想为每一列绘制一个直方图。我取得的最好结果是使用数据框的 hist 方法:

data.hist(bins=20)

但我希望每个直方图的 x 轴都在 log10 范围内。并且 bins 也是 log10 规模,但是使用 bins=np.logspace(-2,2,20) 很容易。

一种解决方法可能是在绘图之前对数据进行 log10 转换,但我尝试过的方法,

data.apply(math.log10)

data.apply(lambda x: math.log10(x))

给我一​​个浮点错误。

    "cannot convert the series to 0".format(str(converter)))
TypeError: ("cannot convert the series to <type 'float'>", u'occurred at index kppawr23')

【问题讨论】:

【参考方案1】:

你可以使用

ax.set_xscale('log')

data.hist() 返回一个坐标轴数组。你需要打电话 ax.set_xscale('log') 用于每个轴,ax 使每个轴对数 缩放。


例如,

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(2015)

N = 100
arr = np.random.random((N,2)) * np.logspace(-2,2,N)[:, np.newaxis]
data = pd.DataFrame(arr, columns=['kppawr23', 'kppaspyd'])

bins = np.logspace(-2,2,20)
axs = data.hist(bins=bins)
for ax in axs.ravel():
    ax.set_xscale('log')

plt.gcf().tight_layout()
plt.show()

产量


顺便说一句,要记录 DataFrame 中每个值的日志,data,您可以使用

logdata = np.log10(data)

因为 NumPy ufunc(例如 np.log10)可以应用于 pandas DataFrames,因为它们操作 elementwise on all the values in the DataFrame。

data.apply(math.log10) 不起作用,因为apply 试图将一整列(一个系列)的值传递给math.log10math.log10 只需要一个标量值。

data.apply(lambda x: math.log10(x)) 失败的原因与data.apply(math.log10) 相同。此外,如果 data.apply(func)data.apply(lambda x: func(x)) 都是可行的选项,则应该首选第一个选项,因为 lambda 函数只会使调用慢一点。

您可以再次使用 data.apply(np.log10),因为 NumPy ufunc np.log10 可以应用于 Series,但是当 np.log10(data) 有效时,没有理由这样做。

您也可以使用data.applymap(math.log10),因为applymap 调用 math.log10data 中的每个值上一次一个。但这会慢得多 比调用等效的 NumPy 函数,np.log10 数据框。不过,如果您需要致电,还是值得了解applymap 一些不是 ufunc 的自定义函数。

【讨论】:

谢谢!我不知道ravel()。我也没有深入研究 numpy 。我一直在尝试专注于 pandas,因为它在读取大型数据集时速度非常快。 顺便问一下,有什么办法可以加快速度吗?我要生成 219 个直方图,这需要几分钟(在 PyCharm 社区版中以调试模式运行)。 我可以以某种方式将tight_layout应用于data.hist吗? 你可以使用plt.gcf().tight_layout();我已经编辑了上面的帖子。您可以通过使用multiprocessing 模块在处理器之间分配工作来加快速度。 Python Module of the Week tutorial on multiprocessing 将是一个很好的起点。

以上是关于想要将 Pandas 数据框绘制为具有 log10 比例 x 轴的多个直方图的主要内容,如果未能解决你的问题,请参考以下文章

将索引转换为名称 pandas 以进行绘图

将具有重叠列名的 Pandas 加入多个数据框?

使用 Matplotlib 更改图形颜色以绘制 Pandas 数据框

Seaborn通过多个groupby绘制熊猫数据框

如何将此 OrderedDict 排序为 pandas 数据框?

将缺失的日期添加到 pandas 数据框