binned errorbar plot with matplotlib: for log-log scale axes

목적



왼쪽 그림과 같은 산점도를 그릴 수있는 상황에서 matplotlib 등에서 오른쪽 그림을 만드는 절차를 소개합니다.



오른쪽 그림에서는 5%, 95%percentile을 errorbar로 하여 그렸다. 또한 삽입식에서 로그의 바닥은 10이다.

환경



파이썬 3.9
Numpy 1.20.1
Pandas 1.2.0
Matplotlib 3.3.3
scikit-learn 0.24.1

방법



import
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import r2_score

데이터 개요
Pandas의 DataFrame에 주어진다고 가정합니다.
print(df.head())

output
         x         y
0  1.84734  18.54020
1  1.87387   8.96109
2  2.72002  41.01980
3  2.66678  18.63230
4  5.80852  47.13240
#例えば10の肩に乗る指数のbin幅を 1/bins=1/10 としたいとき. 線形の場合とは異なる
bins=10
df['logxbin']=10**(round(bins*np.log10(df.x))/bins)

#errorbarをpercentileで作る場合
m=df.groupby('logxbin').quantile(q=0.5)
lower=df.groupby('logxbin').quantile(q=0.05)
upper=df.groupby('logxbin').quantile(q=0.95)

#fitting. 線形の場合とは異なる
c=np.polyfit(np.log10(df.x[df.x>10]) ,np.log10(df.y[df.x>10]),1)
l=10**(c[0]*np.log10(m.index[m.index>10])+c[1])

r2=r2_score(l,m.y[m.index>10])

print(df.head())

output
         x         y   logxbin
0  1.84734  18.54020  1.995262
1  1.87387   8.96109  1.995262
2  2.72002  41.01980  2.511886
3  2.66678  18.63230  2.511886
4  5.80852  47.13240  6.309573
plt.rcParams['font.family'] = 'Arial' 
plt.rcParams['mathtext.fontset'] = 'stix' 
plt.rcParams['font.size'] = 15 
plt.rcParams['xtick.labelsize'] = 9 
plt.rcParams['ytick.labelsize'] = 9 
plt.rcParams['xtick.direction'] = 'in' 
plt.rcParams['ytick.direction'] = 'in' 
plt.rcParams['axes.linewidth'] = 0.7 
plt.rcParams['axes.grid'] = False 

plt.figure(figsize=(3,9/4))
plt.title('binned errorbar plot test: log', fontsize=13)
plt.xlabel('$x$')
plt.ylabel('$y$')
plt.xscale('log')
plt.yscale('log')

#errorbarの設定方法に注意. percentileを使うときこのように書く必要がある
plt.errorbar(m.index, m.y, yerr=[m.y-lower.y, upper.y-m.y], fmt='o', marker='s', mfc='#000000', mec='#000000', 
             ecolor='#2e3436', elinewidth=0.5, capsize=1.0, capthick=1.0)
plt.plot(m.index[m.index>10],l, color='#2e3436', linestyle=':', linewidth=0.7)
plt.text(2, 10**4, f'$\log(y)$={c[0]:.2f}$\log(x)$ + {c[1]:.2f}, \n$R^2$={r2:.2f}', fontsize=13)
plt.savefig('test_log.pdf', transparent=True, bbox_inches='tight')

배경



이어서, 양 로그 스케일의 산점도에서 가로축으로 bin으로 나누어 평균 및 표준 편차/percentile을 사용하여 외관을 깨끗하게 할 필요가 있었다.

과제점



이 오른쪽 그림에 삽입한 회귀식의 바닥은 10이지만 잘 스크립트 내에서 지정할 수 없었다. plt.savefig의 동작을 조사 중입니다.

링크



다음 두 링크로 공부했습니다. 고맙습니다.

선형 스케일에서의 경우plt.errorbar의 사용법과 1 차 함수에 의한 피팅의 예가 있습니다.

matplotlib 오류 막대가있는 그래프 그리기

좋은 웹페이지 즐겨찾기