2015-04-28 21 views
8

Tôi có dữ liệu dấu chấm động trong một khung dữ liệu Pandas. Mỗi cột đại diện cho một biến (chúng có tên chuỗi) và mỗi hàng một tập hợp các giá trị (các hàng có tên số nguyên không quan trọng).Muốn lập biểu đồ Pandas Dataframe dưới dạng Nhiều Biểu đồ có trục x tỷ lệ log10

>>> print data 
0  kppawr23 kppaspyd 
1  3.312387 13.266040 
2  2.775202 0.100000 
3 100.000000 100.000000 
4 100.000000 39.437420 
5  17.017150 33.019040 
... 

Tôi muốn vẽ biểu đồ cho mỗi cột. Kết quả tốt nhất mà tôi đã đạt được là với phương pháp lịch sử của dataframe:

data.hist(bins=20) 

nhưng tôi muốn trục x của mỗi biểu đồ trên thang log10. Và các thùng cũng có quy mô log10, nhưng điều đó là đủ dễ dàng với thùng = np.logspace (-2,2,20).

Một cách giải quyết có thể là để log10 chuyển đổi dữ liệu trước khi âm mưu, nhưng cách tiếp cận tôi đã cố gắng,

data.apply(math.log10) 

data.apply(lambda x: math.log10(x)) 

cho tôi một lỗi dấu chấm động.

"cannot convert the series to {0}".format(str(converter))) 
TypeError: ("cannot convert the series to <type 'float'>", u'occurred at index kppawr23') 

Trả lời

5

Bạn có thể sử dụng

ax.set_xscale('log') 

data.hist() trả về một mảng của các trục. Bạn sẽ cần gọi số ax.set_xscale('log') cho mỗi trục, ax để làm cho mỗi lô được logarithmically được chia tỷ lệ.


Ví dụ,

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 
np.random.seed(2015) 

N = 100 
arr = np.random.random((N,2)) * np.logspace(-2,2,N)[:, np.newaxis] 
data = pd.DataFrame(arr, columns=['kppawr23', 'kppaspyd']) 

bins = np.logspace(-2,2,20) 
axs = data.hist(bins=bins) 
for ax in axs.ravel(): 
    ax.set_xscale('log') 

plt.gcf().tight_layout() 
plt.show() 

mang

enter image description here


Bằng cách này, để có những bản ghi của tất cả các giá trị trong DataFrame, data, bạn có thể sử dụng

logdata = np.log10(data) 

vì NumPy ufuncs (chẳng hạn như np.log10) có thể được áp dụng cho khung dữ liệu gấu trúc vì chúng hoạt động elementwise on all the values in the DataFrame.

data.apply(math.log10) không hoạt động vì apply cố gắng chuyển toàn bộ cột (một Chuỗi) giá trị sang math.log10. math.log10 chỉ có giá trị vô hướng.

data.apply(lambda x: math.log10(x)) không thành công vì lý do tương tự mà data.apply(math.log10) thực hiện. Hơn nữa, nếu data.apply(func)data.apply(lambda x: func(x)) là cả hai tùy chọn khả thi, thì tùy chọn đầu tiên nên được ưu tiên vì hàm lambda sẽ làm cho cuộc gọi chậm hơn một chút.

Bạn có thể sử dụng data.apply(np.log10), một lần nữa vì NumPy ufunc np.log10 có thể được áp dụng cho Series, nhưng không có lý do gì để làm việc này khi np.log10(data) hoạt động.

Bạn cũng có thể sử dụng data.applymap(math.log10) từ applymap cuộc gọi math.log10 trên mỗi giá trị trong data một-at-a-thời gian. Nhưng điều này sẽ chậm hơn hơn là gọi hàm NumPy tương đương, np.log10 trên toàn bộ DataFrame. Tuy nhiên, nó là giá trị biết về applymap trong trường hợp bạn cần phải gọi một số chức năng tùy chỉnh mà không phải là một ufunc.

+0

Cảm ơn! Tôi không biết về ravel(). Tôi cũng chưa từng đi sâu vào đâu. Tôi đã cố gắng tập trung vào gấu trúc vì nó nếu đọc rất nhanh trong các tập dữ liệu lớn. –

+0

Nhân tiện, có cách nào để tăng tốc nó không? Tôi có 219 biểu đồ để sản xuất và phải mất vài phút (chạy trong chế độ gỡ lỗi trong phiên bản cộng đồng PyCharm). –

+0

Và tôi có thể áp dụng tight_layout vào data.hist bằng cách nào đó? –

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