numpy 使用Matplotlib绘制对数尺度的直方图

5tmbdcev  于 2023-08-05  发布在  其他
关注(0)|答案(5)|浏览(106)

我有一个Pandas DataFrame,它在Series中具有以下值

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]

字符串
我被指示用Python 3.6在Jupyter笔记本中绘制两个直方图。

x.plot.hist(bins=8)
plt.show()


我选择了8个箱子,因为这对我来说是最好的。我还被指示用x的对数绘制另一个直方图。

x.plot.hist(bins=8)
plt.xscale('log')
plt.show()


这个直方图看起来很可怕。我做错什么了吗?我试着摆弄了一下图,但我所做的一切似乎都让直方图看起来更糟。示例如下:

x.plot(kind='hist', logx=True)


除了将X的对数绘制成直方图外,我没有得到任何指示。
为了记录在案,我已经导入了pandas、numpy和matplotlib,并指定绘图应该是内联的。

xmq68pz9

xmq68pz91#

hist调用中指定bins=8意味着最小值和最大值之间的范围被平均划分为8个bin。在线性尺度上相等的东西在对数尺度上是扭曲的。
你可以做的是指定直方图的条柱,使它们在宽度上不相等,从而使它们在对数尺度上看起来相等。

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

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 
     19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]
x = pd.Series(x)

# histogram on linear scale
plt.subplot(211)
hist, bins, _ = plt.hist(x, bins=8)

# histogram on log scale. 
# Use non-equal bin sizes, such that they look equal on log scale.
logbins = np.logspace(np.log10(bins[0]),np.log10(bins[-1]),len(bins))
plt.subplot(212)
plt.hist(x, bins=logbins)
plt.xscale('log')
plt.show()

字符串


的数据

kr98yfug

kr98yfug2#

这里是另一个解决方案,不使用子图或在同一图像中绘制两个东西。

import numpy as np
import matplotlib.pyplot as plt

def plot_loghist(x, bins):
  hist, bins = np.histogram(x, bins=bins)
  logbins = np.logspace(np.log10(bins[0]),np.log10(bins[-1]),len(bins))
  plt.hist(x, bins=logbins)
  plt.xscale('log')

plot_loghist(np.random.rand(200), 10)

字符串


的数据

rdlzhqv9

rdlzhqv93#

用x的对数绘制另一个直方图。
与在对数尺度上绘制x不同。画出x的对数是

np.log(x).plot.hist(bins=8)
plt.show()

字符串


的数据
不同之处在于x本身的值被转换为:我们在看它们的对数。
这与在对数标度上绘图不同,在对数标度上,我们保持x不变,但改变了水平轴的标记方式(向右挤压条,向左拉伸条)。

jei2mxaa

jei2mxaa4#

根据我的实验,np.histogram的使用可能是不必要的,因为x的两端正好是最小值和最大值,不需要np.histogram来计算:

import numpy as np
from matplotlib import pyplot as plt

def plot_loghist(x, bins):
    logbins = np.logspace(np.log10(np.min(x)),np.log10(np.max(x)),bins+1)
    plt.hist(x, bins=logbins)
    plt.xscale('log')

plot_loghist(np.random.rand(200), 10)

字符串

eimct9ow

eimct9ow5#

Seaborn对于具有对数尺度的直方图也是一个很好的解决方案,而不必像使用matplotlib那样手动指定直方图bin边缘。

# standard imports...
import seaborn as sns

x = [2, 1, 76, 140, 286, 267, 60, 271, 5, 13, 9, 76, 77, 6, 2, 27, 22, 1, 12, 7, 19, 81, 11, 173, 13, 7, 16, 19, 23, 197, 167, 1]
x = pd.Series(x)
plt.hist(x)
plt.xscale('log')
plt.gca().set(title='Matplotlib histogram, logarithmic x axis')
plt.show()
#x.plot(kind='hist', log=True)

sns.histplot(x, bins=8, log_scale=True)
plt.gca().set(title='Seaborn histogram, logarithmic x axis')
plt.show()
sns.histplot(x, bins=8, log_scale=True)
plt.gca().set(title='Seaborn histogram, logarithmic x axis, with scalar ticks')
plt.gca().xaxis.set_major_formatter(mpl.ticker.ScalarFormatter())
plt.gca().set_xticks([1, 10, 100, 150])
plt.show()

字符串

相关问题