2012-11-21 29 views
10

Trong một số trường hợp matplotlib hiển thị ô có lỗi sai khi sử dụng thang đo loga. Giả sử những dữ liệu này (trong vòng pylab ví dụ):Thiếu thanh lỗi khi sử dụng yscale ('log') tại matplotlib

s=[19.0, 20.0, 21.0, 22.0, 24.0] 
v=[36.5, 66.814250000000001, 130.17750000000001, 498.57466666666664, 19.41] 
verr=[0.28999999999999998, 80.075044597909169, 71.322124839818571, 650.11015891565125, 0.02] 
errorbar(s,v,yerr=verr) 

và tôi nhận được một kết quả bình thường nhưng khi tôi chuyển sang quy mô lôgarít:

yscale('log') 

tôi nhận được một âm mưu trong đó một số errorbars không nhìn thấy được , mặc dù bạn vẫn có thể thấy một số nắp thanh lỗi. (Xem bên dưới.) Tại sao điều này xảy ra và tôi có thể khắc phục nó như thế nào?

log plot example

Trả lời

10

Vấn đề là đối với một số điểm v-verr đang trở thành tiêu cực, giá trị < = 0 không thể được hiển thị trên một trục logarit (log(x), x<=0 là undefined) Để làm được việc này bạn có thể sử dụng các lỗi bất đối xứng và có hiệu lực các giá trị kết quả trên 0 cho các điểm vi phạm.

Tại bất kỳ thời điểm nào có lỗi lớn hơn giá trị verr>=v, chúng tôi chỉ định verr=.999v trong trường hợp này, thanh lỗi sẽ đến gần bằng không.

Đây là kịch bản

import matplotlib.pyplot as plt 
import numpy as np 

s=[19.0, 20.0, 21.0, 22.0, 24.0] 
v=np.array([36.5, 66.814250000000001, 130.17750000000001, 498.57466666666664, 19.41]) 
verr=np.array([0.28999999999999998, 80.075044597909169, 71.322124839818571,  650.11015891565125, 0.02]) 
verr2 = np.array(verr) 
verr2[verr>=v] = v[verr>=v]*.999999 
plt.errorbar(s,v,yerr=[verr2,verr]) 
plt.ylim(1E1,1E4) 
plt.yscale('log') 
plt.show() 

Dưới đây là kết quả

Logarithmic plot with error bars

17

Chuyển đến quy mô lôgarít, nhưng với lệnh này:

plt.yscale('log', nonposy='clip') 

Tương tự, đối với x -axis:

plt.xscale('log', nonposx='clip') 

Dù sao, nếu bạn nhận được dev version of matplotlib trong nửa năm qua, bạn sẽ có hành vi cắt này theo mặc định, như được thảo luận trong Make nonposy='clip' default for log scale y-axes.

+3

Đây thực sự là câu trả lời đúng. Đơn giản hơn nhiều so với giải pháp của Dan. –

Các vấn đề liên quan