Một biểu đồ đơn giản có thể là bước đầu tiên tuyệt vời trong việc tìm hiểu một bộ dữ liệu. Trước đó, chúng tôi đã thấy một bản xem trước của hàm biểu đồ của Matplotlib [xem so sánh, mặt nạ và logic boolean], tạo ra một biểu đồ cơ bản trong một dòng, một khi nhập khẩu nồi hơi bình thường được thực hiện:
In [1]:
%matplotlib inline import numpy as np import matplotlib.pyplot as plt plt.style.use['seaborn-white'] data = np.random.randn[1000]
Hàm hist[]
có nhiều tùy chọn để điều chỉnh cả tính toán và màn hình; Dưới đây là một ví dụ về biểu đồ tùy chỉnh hơn:
In [3]:
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];
DocString
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];0 có nhiều thông tin hơn về các tùy chọn tùy chỉnh khác có sẵn. Tôi thấy sự kết hợp này của
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];1 cùng với một số minh bạch
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];2 rất hữu ích khi so sánh biểu đồ của một số phân phối:
In [4]:
x1 = np.random.normal[0, 0.8, 1000] x2 = np.random.normal[-2, 1, 1000] x3 = np.random.normal[3, 2, 1000] kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40] plt.hist[x1, **kwargs] plt.hist[x2, **kwargs] plt.hist[x3, **kwargs];
Nếu bạn chỉ muốn tính toán biểu đồ [nghĩa là đếm số lượng điểm trong một thùng nhất định] và không hiển thị nó, hàm
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];3 có sẵn:
In [5]:
counts, bin_edges = np.histogram[data, bins=5] print[counts]
Biểu đồ hai chiều và Binnings¶
Giống như chúng ta tạo biểu đồ theo một chiều bằng cách chia dòng số thành các thùng, chúng ta cũng có thể tạo biểu đồ thành hai chiều bằng cách chia các điểm giữa các thùng hai chiều. Chúng tôi sẽ xem xét ngắn gọn một số cách để làm điều này ở đây. Chúng tôi sẽ bắt đầu bằng cách xác định một số dữ liệu.
In [6]:
mean = [0, 0] cov = [[1, 1], [1, 2]] x, y = np.random.multivariate_normal[mean, cov, 10000].T
plt.hist[data, bins=30, normed=True, alpha=0.5,
histtype='stepfilled', color='steelblue',
edgecolor='none'];
6: Biểu đồ hai chiều
Một cách đơn giản để vẽ biểu đồ hai chiều là sử dụng hàm
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];6 của Matplotlib:
In [12]:
plt.hist2d[x, y, bins=30, cmap='Blues'] cb = plt.colorbar[] cb.set_label['counts in bin']
Giống như với
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];0,
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];6 có một số tùy chọn bổ sung để tinh chỉnh cốt truyện và Binning, được phác thảo một cách độc đáo trong chức năng DocString. Hơn nữa, giống như
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];0 có một đối tác trong
x1 = np.random.normal[0, 0.8, 1000] x2 = np.random.normal[-2, 1, 1000] x3 = np.random.normal[3, 2, 1000] kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40] plt.hist[x1, **kwargs] plt.hist[x2, **kwargs] plt.hist[x3, **kwargs];1,
plt.hist[data, bins=30, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none'];6 có một đối tác trong
x1 = np.random.normal[0, 0.8, 1000] x2 = np.random.normal[-2, 1, 1000] x3 = np.random.normal[3, 2, 1000] kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40] plt.hist[x1, **kwargs] plt.hist[x2, **kwargs] plt.hist[x3, **kwargs];3, có thể được sử dụng như sau:
In [8]:
counts, xedges, yedges = np.histogram2d[x, y, bins=30]
Để khái quát hóa của biểu đồ này theo kích thước cao hơn hai, hãy xem hàm
x1 = np.random.normal[0, 0.8, 1000] x2 = np.random.normal[-2, 1, 1000] x3 = np.random.normal[3, 2, 1000] kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40] plt.hist[x1, **kwargs] plt.hist[x2, **kwargs] plt.hist[x3, **kwargs];4.
x1 = np.random.normal[0, 0.8, 1000]
x2 = np.random.normal[-2, 1, 1000]
x3 = np.random.normal[3, 2, 1000]
kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40]
plt.hist[x1, **kwargs]
plt.hist[x2, **kwargs]
plt.hist[x3, **kwargs];
5: Binnings lục giác
Biểu đồ hai chiều tạo ra một hình vuông của các hình vuông trên các trục. Một hình dạng tự nhiên khác cho một tesselation như vậy là hình lục giác thông thường. Với mục đích này, Matplotlib cung cấp thói quen
x1 = np.random.normal[0, 0.8, 1000] x2 = np.random.normal[-2, 1, 1000] x3 = np.random.normal[3, 2, 1000] kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40] plt.hist[x1, **kwargs] plt.hist[x2, **kwargs] plt.hist[x3, **kwargs];5, sẽ đại diện cho một bộ dữ liệu hai chiều bị hỏng trong một lưới các hình lục giác:
In [9]:
plt.hexbin[x, y, gridsize=30, cmap='Blues'] cb = plt.colorbar[label='count in bin']
x1 = np.random.normal[0, 0.8, 1000] x2 = np.random.normal[-2, 1, 1000] x3 = np.random.normal[3, 2, 1000] kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40] plt.hist[x1, **kwargs] plt.hist[x2, **kwargs] plt.hist[x3, **kwargs];5 có một số tùy chọn thú vị, bao gồm khả năng chỉ định trọng số cho từng điểm và thay đổi đầu ra trong mỗi thùng thành bất kỳ cốt liệu nhảm nhí nào [trung bình của trọng số, độ lệch chuẩn của trọng số, v.v.].
Ước tính mật độ hạt nhân
Một phương pháp phổ biến khác để đánh giá mật độ trong nhiều chiều là ước tính mật độ hạt nhân [KDE]. Điều này sẽ được thảo luận đầy đủ hơn về chiều sâu: ước tính mật độ hạt nhân, nhưng bây giờ chúng ta sẽ chỉ đề cập rằng KDE có thể được coi là một cách để "bôi nhọ" các điểm trong không gian và thêm kết quả để đạt được hàm số. Một triển khai KDE cực kỳ nhanh chóng và đơn giản tồn tại trong gói
x1 = np.random.normal[0, 0.8, 1000] x2 = np.random.normal[-2, 1, 1000] x3 = np.random.normal[3, 2, 1000] kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40] plt.hist[x1, **kwargs] plt.hist[x2, **kwargs] plt.hist[x3, **kwargs];8. Dưới đây là một ví dụ nhanh về việc sử dụng KDE trên dữ liệu này:
In [10]:
from scipy.stats import gaussian_kde # fit an array of size [Ndim, Nsamples] data = np.vstack[[x, y]] kde = gaussian_kde[data] # evaluate on a regular grid xgrid = np.linspace[-3.5, 3.5, 40] ygrid = np.linspace[-6, 6, 40] Xgrid, Ygrid = np.meshgrid[xgrid, ygrid] Z = kde.evaluate[np.vstack[[Xgrid.ravel[], Ygrid.ravel[]]]] # Plot the result as an image plt.imshow[Z.reshape[Xgrid.shape], origin='lower', aspect='auto', extent=[-3.5, 3.5, -6, 6], cmap='Blues'] cb = plt.colorbar[] cb.set_label["density"]
KDE có độ dài làm mịn, trượt một cách hiệu quả núm giữa chi tiết và độ mịn [một ví dụ về sự đánh đổi không biến đổi thiên vị phổ biến]. Các tài liệu về việc chọn một độ dài làm mịn thích hợp là rất lớn:
x1 = np.random.normal[0, 0.8, 1000] x2 = np.random.normal[-2, 1, 1000] x3 = np.random.normal[3, 2, 1000] kwargs = dict[histtype='stepfilled', alpha=0.3, normed=True, bins=40] plt.hist[x1, **kwargs] plt.hist[x2, **kwargs] plt.hist[x3, **kwargs];9 sử dụng một quy tắc để cố gắng tìm độ dài làm mịn gần như tối ưu cho dữ liệu đầu vào.
Các triển khai KDE khác có sẵn trong hệ sinh thái SCIPY, mỗi người có điểm mạnh và điểm yếu riêng; Xem, ví dụ,
counts, bin_edges = np.histogram[data, bins=5] print[counts]0 và
counts, bin_edges = np.histogram[data, bins=5] print[counts]1. Đối với trực quan hóa dựa trên KDE, sử dụng matplotlib có xu hướng quá dài dòng. Thư viện Seaborn, được thảo luận trong trực quan hóa với Seaborn, cung cấp API ngắn gọn hơn nhiều để tạo ra các trực quan hóa dựa trên KDE.