2012-02-28 36 views
14

Tôi đang cố gắng điền vào khu vực dưới một đường cong với matplotlib. Kịch bản bên dưới hoạt động tốt.Điền vào khu vực dưới đường cong trong python matlibplot trên quy mô log

import matplotlib.pyplot as plt 
from math import sqrt 
x = range(100) 
y = [sqrt(i) for i in x] 
plt.plot(x,y,color='k',lw=2) 
plt.fill_between(x,y,0,color='0.8') 
plt.show() 

Tuy nhiên, nếu tôi đặt thang y thành logarit (xem bên dưới). Đôi khi nó lấp đầy khu vực phía trên đường cong! Ai giúp tôi với? Tôi muốn lấp đầy khu vực giữa đường cong và y = 0.

x = range(100) 
y = [sqrt(i) for i in x] 
plt.plot(x,y,color='k',lw=2) 
plt.fill_between(x,y,0,color='0.8') 
plt.yscale('log') 
plt.show() 

Cảm ơn bạn trước!

Trả lời

13

Với thang điểm y logarit, fill_between(x, y, 0) yêu cầu matplotlib điền vào khu vực giữa log(0) = -infinitylog(y). Đương nhiên, nó balks. Bạn có thể tránh sự cố bằng cách thay đổi 0 thành một số nhỏ như 1e-6.

+0

Tất nhiên! 1e-6 có thể quá nhỏ, nhưng plt.fill_between (x, y, 1, color = '0.8') hoạt động tốt! –

2

Như đã đề cập, 0 -> -inf trong thang đo log. Do đó, bất kỳ giá trị được vẽ nào nhỏ hơn hoặc bằng 0 sẽ là vấn đề (yêu cầu một số ylim vô hạn trong không gian log). Vấn đề này tồn tại độc lập cho dù bạn đang sử dụng fill_between() hay không.

May mắn thay, matplotlib cung cấp cách xử lý độc đáo này. Trong hành vi mặc định, matplotlib mặt nạ các giá trị của mọi giá trị nhỏ hơn hoặc bằng không. Trong ví dụ của bạn, điều này có nghĩa là toàn bộ dòng y=0 của bạn bị che khuất và loại trừ khỏi đa giác xác định khu vực được điền giữa. Kết quả là đa giác chỉ đơn giản là đóng bằng cách vẽ một đường từ (100,10) xuống và sang trái đến (0,0). Một tùy chọn khác là để cắt các giá trị. Trong trường hợp này, chúng được đặt thành 1e-300 và không được tham khảo khi xác định ylim của cốt truyện. Vì vậy, để có được kết quả mong muốn của bạn, hãy làm như sau:

plt.yscale('log', nonposy='clip') 
Các vấn đề liên quan