物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

Python+matplotlibで2次元ヒストグラム(hist2d)のビンの値を直接操作する

pythonのmatplotlibで2次元ヒストグラム(plt.hist2d)のビンの値 (bin contents)を直接操作する方法はない。なので、 colormesh を使って描画しよう。

import numpy as np
import matplotlib.pyplot as plt
from itertools import product

Z, X, Y = np.histogram2d([],[],bins=[50,100],range=[[-10,10],[-10,10]])
xx = np.array([xy[0] for xy in product(X,Y)])
yy = np.array([xy[1] for xy in product(X,Y)])

def f(x,y):
    return np.exp(-((x-1)**2) / (2 * 1**2)) * np.exp(-((y-2)**2) / (2 * 3**2))
Z = f(xx,yy).reshape(51, 101)
Z = np.rot90(Z) # np.histogram2dの仕様上必要
Z = np.flipud(Z) # np.histogram2dの仕様上必要

im = plt.pcolormesh(X,Y,Z,cmap="viridis")

im.set_clim(0,1.1) #カラーバーの表示範囲
plt.colorbar(im,label="Counts") #カラーバーを表示しラベルをセット
plt.xlabel("X")
plt.ylabel("Y")
plt.show()

このようにしてカラーマップを作成することが出来る。

普通のヒストグラム(一次元ヒストグラム)の場合

import numpy as np
import matplotlib.pyplot as plt
from itertools import product

_, X, Y = np.histogram2d([],[],bins=[10,10],range=[[-40,10],[0,20]])

im = plt.pcolormesh(X,Y,np.random.randn(10, 10),cmap="viridis")

im.set_clim(0,1.1) #カラーバーの表示範囲
plt.colorbar(im,label="Counts") #カラーバーを表示しラベルをセット
plt.xlabel("X")
plt.ylabel("Y")
plt.show()