2014-08-29 64 views
20

Có cách nào để thực hiện việc này không? Tôi không thể có vẻ là một cách dễ dàng để giao diện hàng loạt gấu trúc với âm mưu một CDF.Vẽ CDF của một loạt gấu trúc trong python

+1

bạn có thể xác định vấn đề của bạn? Đầu vào và đầu ra là gì? scipy.stats có các chức năng cdf mà bạn có thể quan tâm. –

+3

Có một yêu cầu tính năng cho điều này, nhưng nó nằm ngoài miền của gấu trúc. Sử dụng 'kdeplot' của [seaborn] (http://web.stanford.edu/~mwaskom/software/seaborn/tutorial/plotting_distributions.html#basic-visualization-with-histograms) với' tích lũy = True' – TomAugspurger

+0

Đầu vào là một chuỗi, đầu ra là một âm mưu của một hàm CDF. – robertevansanders

Trả lời

40

Tôi tin rằng các chức năng bạn đang tìm kiếm là trong phương pháp hist của một đối tượng dòng mà kết thúc tốt đẹp các chức năng hist() trong matplotlib

Dưới đây là các tài liệu có liên quan

In [10]: import matplotlib.pyplot as plt 

In [11]: plt.hist? 
... 
Plot a histogram. 

Compute and draw the histogram of *x*. The return value is a 
tuple (*n*, *bins*, *patches*) or ([*n0*, *n1*, ...], *bins*, 
[*patches0*, *patches1*,...]) if the input contains multiple 
data. 
... 
cumulative : boolean, optional, default : True 
    If `True`, then a histogram is computed where each bin gives the 
    counts in that bin plus all bins for smaller values. The last bin 
    gives the total number of datapoints. If `normed` is also `True` 
    then the histogram is normalized such that the last bin equals 1. 
    If `cumulative` evaluates to less than 0 (e.g., -1), the direction 
    of accumulation is reversed. In this case, if `normed` is also 
    `True`, then the histogram is normalized such that the first bin 
    equals 1. 

... 

Ví dụ

In [12]: import pandas as pd 

In [13]: import numpy as np 

In [14]: ser = pd.Series(np.random.normal(size=1000)) 

In [15]: ser.hist(cumulative=True, normed=1, bins=100) 
Out[15]: <matplotlib.axes.AxesSubplot at 0x11469a590> 

In [16]: plt.show() 
+0

vui lòng thêm một số mô tả và liên kết để sao lưu mã nếu có thể – Ram

+1

Có cách nào để có được chức năng bước và không có các thanh được điền vào? – robertevansanders

+6

Đó là 'histtype = 'step'' cũng nằm trong tài liệu' pyplot.hist' bị cắt bớt ở trên –

13

Một ô hàm phân phối CDF hoặc tích lũy về cơ bản là biểu đồ có trục X giá trị được sắp xếp và trên trục Y phân phối tích lũy. Vì vậy, tôi sẽ tạo một chuỗi mới với các giá trị được sắp xếp làm chỉ mục và phân phối tích lũy làm giá trị.

Đầu tiên tạo ra một loạt ví dụ:

import pandas as pd 
import numpy as np 
ser = pd.Series(np.random.normal(size=100)) 

Sắp xếp series:

ser = ser.sort_values() 

Bây giờ, trước khi tiếp tục, thêm một lần nữa (và lớn nhất) giá trị cuối cùng. Bước này rất quan trọng đặc biệt đối với các kích cỡ mẫu nhỏ để có được một CDF không thiên vị:

ser[len(ser)] = ser.iloc[-1] 

Tạo một loạt mới với các giá trị được sắp xếp như chỉ số và phân phối tích lũy như các giá trị:

cum_dist = np.linspace(0.,1.,len(ser)) 
ser_cdf = pd.Series(cum_dist, index=ser) 

Cuối cùng, vẽ đồ thị hàm số như bước sau:

ser_cdf.plot(drawstyle='steps') 
+5

Tại sao cần phải nối thêm giá trị cuối cùng? –

+1

'đơn hàng' không được chấp nhận. Sử dụng 'ser.sort_values ​​()'. – Lukas

+0

@kadee 'ser [len (ser)] = ser.iloc [-1]' không hoạt động trên gấu trúc 0.19 – jlandercy

2

Đối với tôi, điều này dường như là một cách đơn giản để làm điều đó:

import numpy as np 
import pandas as pd 
import matplotlib.pyplot as plt 

heights = pd.Series(np.random.normal(size=100)) 

# empirical CDF 
def F(x,data): 
    return float(len(data[data <= x]))/len(data) 

vF = np.vectorize(F, excluded=['data']) 

plt.plot(np.sort(heights),vF(x=np.sort(heights), data=heights)) 
3

Đây là cách dễ nhất.

import pandas as pd 
df = pd.Series([i for i in range(100)]) 
df.hist(cumulative='True') 

Image of cumulative histogram

+0

Đây phải là câu trả lời được chấp nhận! –

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