web-dev-qa-db-ja.com

Matplotlibを使用してログスケールでヒストグラムをプロットする

pandas Seriesに次の値を持つDataFrameがあります

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。汗がかからない?

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をインポートし、プロットがインラインになるように指定しました。

11
Tommy

hist呼び出しでbins=8を指定すると、最小値と最大値の間の範囲が8つのビンに均等に分割されます。線形スケールで等しいものは、対数スケールでは歪んでいます。

ヒストグラムのビンを指定して、対数目盛で均等に見えるように幅が等しくないようにすることができます。

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()

enter image description here

xの対数で別のヒストグラムをプロットします。

xを対数スケールでプロットすることと同じではありません。 xの対数をプロットすると

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

hist

違いは、x自体の値が変換されていることです。対数を見ています。

これは、対数スケールでのプロットとは異なります。対数スケールでは、xを同じに保ちながら、水平軸のマークアップ方法を変更します(バーを右に絞り、左に引き伸ばします)。

7
user6655984

サブプロットを使用したり、同じ画像に2つのことをプロットしたりしないもう1つのソリューションを次に示します。

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)

example hist plot

4
Rahul Shaw