Biểu đồ Matplotlib


107

Vì vậy, tôi có một vấn đề nhỏ. Tôi có một tập dữ liệu trong scipy đã ở định dạng biểu đồ, vì vậy tôi có tâm của các thùng và số lượng sự kiện trên mỗi thùng. Làm thế nào tôi có thể vẽ biểu đồ dưới dạng biểu đồ. Tôi vừa thử làm

bins, n=hist()

nhưng nó không giống như vậy. Bất kỳ khuyến nghị?

Câu trả lời:


239
import matplotlib.pyplot as plt
import numpy as np

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
hist, bins = np.histogram(x, bins=50)
width = 0.7 * (bins[1] - bins[0])
center = (bins[:-1] + bins[1:]) / 2
plt.bar(center, hist, align='center', width=width)
plt.show()

nhập mô tả hình ảnh ở đây

Giao diện hướng đối tượng cũng đơn giản:

fig, ax = plt.subplots()
ax.bar(center, hist, align='center', width=width)
fig.savefig("1.png")

Nếu bạn đang sử dụng thùng tùy chỉnh (không cố định), bạn có thể chuyển tính toán chiều rộng bằng cách sử dụng np.diff, chuyển chiều rộng cho ax.barvà sử dụng ax.set_xticksđể gắn nhãn các cạnh thùng:

import matplotlib.pyplot as plt
import numpy as np

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
bins = [0, 40, 60, 75, 90, 110, 125, 140, 160, 200]
hist, bins = np.histogram(x, bins=bins)
width = np.diff(bins)
center = (bins[:-1] + bins[1:]) / 2

fig, ax = plt.subplots(figsize=(8,3))
ax.bar(center, hist, align='center', width=width)
ax.set_xticks(bins)
fig.savefig("/tmp/out.png")

plt.show()

nhập mô tả hình ảnh ở đây


Có cách nào để chuyển các cạnh bin đến trục x của biểu đồ thanh?
CMCDragonkai

@CMCDragonkai: plt.bar's widththam số có thể chấp nhận một mảng giống như đối tượng (thay vì một vô hướng). Vì vậy, bạn có thể sử dụng width = np.diff(bins)thay thế width = 0.7 * (bins[1] - bins[0]).
unutbu

Nhưng widthbản thân thiết lập chỉ thiết lập chiều rộng của thanh phải không? Tôi đang nói về các nhãn trục x (nghĩa là tôi muốn xem các cạnh thùng thực tế là các nhãn trên trục x). Nó phải tương tự như cách plt.histhoạt động.
CMCDragonkai

2
@CMCDragonkai: Bạn có thể sử dụng ax.set_xticksđể đặt xlabels. Tôi đã thêm một ví dụ ở trên để cho thấy ý tôi muốn nói.
unutbu

22

Nếu bạn không muốn có các thanh, bạn có thể vẽ nó như sau:

import numpy as np
import matplotlib.pyplot as plt

mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

bins, edges = np.histogram(x, 50, normed=1)
left,right = edges[:-1],edges[1:]
X = np.array([left,right]).T.flatten()
Y = np.array([bins,bins]).T.flatten()

plt.plot(X,Y)
plt.show()

biểu đồ


6
Bạn cũng có thể sử dụng ax.step.
tacaswell

12

Tôi biết điều này không trả lời được câu hỏi của bạn, nhưng tôi luôn kết thúc trên trang này, khi tôi tìm kiếm giải pháp matplotlib cho biểu đồ, vì đơn giản histogram_demođã bị xóa khỏi trang thư viện ví dụ về matplotlib.

Đây là một giải pháp, không cần numpynhập. Tôi chỉ nhập numpy để tạo dữ liệu xđược vẽ. Nó dựa vào hàm histthay vì hàm barnhư trong câu trả lời của @unutbu.

import numpy as np
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)

import matplotlib.pyplot as plt
plt.hist(x, bins=50)
plt.savefig('hist.png')

nhập mô tả hình ảnh ở đây

Ngoài ra, hãy xem thư viện matplotlib và các ví dụ về matplotlib .


"Đây là một giải pháp, mà không yêu cầu NumPy" - dòng đầu tiên của hàng nhập khẩu đang NumPy :)
Martin R.

2
@Martin R. Đó chỉ để tạo ra dữ liệu được vẽ. Xem dòng 4-6. Không sử dụng numpy.
tommy.carstensen

6

Nếu bạn sẵn sàng sử dụng pandas:

pandas.DataFrame({'x':hist[1][1:],'y':hist[0]}).plot(x='x',kind='bar')

27
Nếu bạn định đề xuất sử dụng, pandasbạn có thể nên bao gồm một liên kết đến trang web của họ và một ví dụ khác giải thích những gì đang xảy ra.
tacaswell

0

Tôi nghĩ điều này có thể hữu ích cho ai đó.

Đối với sự khó chịu của tôi, hàm biểu đồ của Numpy (mặc dù, tôi đánh giá cao là có lý do chính đáng cho nó), trả về các cạnh của mỗi thùng, thay vì giá trị của thùng. Mặc dù, điều này có ý nghĩa đối với các số dấu phẩy động, có thể nằm trong một khoảng (tức là giá trị trung tâm không có ý nghĩa siêu lớn), đây không phải là đầu ra mong muốn khi xử lý các giá trị hoặc số nguyên rời rạc (0, 1, 2, v.v.) . Đặc biệt, chiều dài của các thùng được trả về từ np.histogram không bằng độ dài của số lượng / mật độ.

Để giải quyết vấn đề này, tôi đã sử dụng np.digitize để lượng tử hóa đầu vào và trả về một số thùng riêng biệt, cùng với phần nhỏ số lượng cho mỗi thùng. Bạn có thể dễ dàng chỉnh sửa để có được số lượng nguyên.

def compute_PMF(data)
    import numpy as np
    from collections import Counter
    _, bins = np.histogram(data, bins='auto', range=(data.min(), data.max()), density=False)
    h = Counter(np.digitize(data,bins) - 1)
    weights = np.asarray(list(h.values())) 
    weights = weights / weights.sum()
    values = np.asarray(list(h.keys()))
    return weights, values
####

Refs:

[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.histogram.html

[2] https://docs.scipy.org/doc/numpy/reference/generated/numpy.digitize.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.