binned errorbar plot with matplotlib: for log-log scale axes
14109 단어 errorbarlogscalebinningmatplotlib
목적
왼쪽 그림과 같은 산점도를 그릴 수있는 상황에서 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 오류 막대가있는 그래프 그리기
Reference
이 문제에 관하여(binned errorbar plot with matplotlib: for log-log scale axes), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/HajimeKoike/items/da76559c11283b140df4텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)