2011-07-29 70 views
114

Tôi đã tạo một biểu đồ histogram bằng cách sử dụng dữ liệu từ một tệp và không có vấn đề gì. Bây giờ tôi muốn chồng vật nầy lên vật khác dữ liệu từ khác tập tin trong biểu đồ tương tự, vì vậy tôi làm điều gì đó nhưVẽ hai biểu đồ cùng lúc với matplotlib

n,bins,patchs = ax.hist(mydata1,100) 
n,bins,patchs = ax.hist(mydata2,100) 

nhưng vấn đề ở đây là mỗi khoảng thời gian, chỉ có quầy bar với giá trị cao nhất xuất hiện, và người kia đang ẩn . Tôi tự hỏi làm thế nào tôi có thể vẽ cả hai biểu đồ cùng lúc với các màu khác nhau.

Trả lời

224

Ở đây bạn có một ví dụ làm việc:

import random 
import numpy 
from matplotlib import pyplot 

x = [random.gauss(3,1) for _ in range(400)] 
y = [random.gauss(4,2) for _ in range(400)] 

bins = numpy.linspace(-10, 10, 100) 

pyplot.hist(x, bins, alpha=0.5, label='x') 
pyplot.hist(y, bins, alpha=0.5, label='y') 
pyplot.legend(loc='upper right') 
pyplot.show() 

enter image description here

+1

Nó sẽ không phải là một ý tưởng tốt để thiết lập 'pyplot.hold (True)' trước khi âm mưu, chỉ trong trường hợp? – JAB

+2

Không chắc chắn nếu giữ (True) được đặt trong thông số cấu hình matplotlib của tôi hoặc pyplot hoạt động như thế này theo mặc định, nhưng đối với tôi mã hoạt động như nó được. Mã được trích xuất từ ​​một ứng dụng lớn hơn mà không đưa ra bất kỳ vấn đề nào cho đến nay.Dù sao, câu hỏi hay mà tôi đã tự viết cho mình khi viết mã số – joaquin

+0

@joaquin: làm thế nào tôi có thể chỉ định x là màu xanh dương và y là màu đỏ? – amc

3

Có vẻ như bạn có thể muốn chỉ là một biểu đồ hình cột:

Ngoài ra, bạn có thể sử dụng ô phụ.

+0

sự khác biệt là với lịch sử bạn nhận được một âm mưu tần số. có lẽ bạn nên chỉ cách làm thế nào. tần số với gấu trúc + bar cốt truyện = hist() –

49

Những câu trả lời chấp nhận cung cấp cho các mã cho một biểu đồ với chồng chéo quán bar, nhưng trong trường hợp bạn muốn mỗi thanh là side-by-side (như tôi đã làm), hãy thử các biến thể dưới đây:

import numpy as np 
import matplotlib.pyplot as plt 
plt.style.use('seaborn-deep') 

x = np.random.normal(1, 2, 5000) 
y = np.random.normal(-1, 3, 5000) 
data = np.vstack([x, y]).T 
bins = np.linspace(-10, 10, 30) 

plt.hist(data, bins, alpha=0.7, label=['x', 'y']) 
plt.legend(loc='upper right') 
plt.show() 

enter image description here

tham khảo: http://matplotlib.org/examples/statistics/histogram_demo_multihist.html

+5

Làm cách nào để tạo biểu đồ trên cùng một ô từ hai mảng dữ liệu với các kích thước khác nhau? –

+0

Tôi e rằng không thể thực hiện tại thời điểm này mà không có một số tin nhắn cấp thấp hơn matplotlib (tức là không thể thực hiện ngay lập tức với hộp có hàm mức cao như 'plt.hist'). Cách giải quyết đơn giản là sử dụng câu trả lời của @ joaquin. Một giải pháp khác (có khả năng tốt hơn) sẽ là điền vào mảng có kích thước khác với 'np.nan' để bạn có thể tạo' dữ liệu', nhưng thậm chí matplotlib cũng không thành công. Có một yêu cầu kéo đang chờ xử lý giải quyết rằng: https://github.com/matplotlib/matplotlib/pull/7133 –

+10

Tôi đã giải quyết nó bằng cách sử dụng 'plt.hist ([x, y], color = ['g', 'r'] , alpha = 0,8, thùng = 50) ' –

0

Chỉ trong trường hợp bạn có gấu trúc (import pandas as pd) hoặc là ok với việc sử dụng nó:

test = pd.DataFrame([[random.gauss(3,1) for _ in range(400)], 
        [random.gauss(4,2) for _ in range(400)]]) 
plt.hist(test.values.T) 
plt.show() 
6

Đây là một phương pháp đơn giản để vẽ hai biểu đồ, với những thanh của họ side-by-side , trên cốt truyện tương tự khi các dữ liệu có kích thước khác nhau:

def plotHistogram(p, o): 
    """ 
    p and o are iterables with the values you want to 
    plot the histogram of 
    """ 
    plt.hist([p, o], color=['g','r'], alpha=0.8, bins=50) 
    plt.show() 
3

Trong trường hợp bạn có kích cỡ mẫu khác nhau, nó có thể khó khăn để so sánh các bản phân phối với một trục y duy nhất. Ví dụ:

import numpy as np 
import matplotlib.pyplot as plt 

#makes the data 
y1 = np.random.normal(-2, 2, 1000) 
y2 = np.random.normal(2, 2, 5000) 
colors = ['b','g'] 

#plots the histogram 
fig, ax1 = plt.subplots() 
ax1.hist([y1,y2],color=colors) 
ax1.set_xlim(-10,10) 
ax1.set_ylabel("Count") 
plt.tight_layout() 
plt.show() 

hist_single_ax

Trong trường hợp này, bạn có thể vẽ hai bộ dữ liệu của bạn trên các trục khác nhau. Để làm như vậy, bạn có thể nhận được dữ liệu biểu đồ của bạn sử dụng matplotlib, xóa các trục, và sau đó lại cốt truyện nó trên hai trục riêng biệt (thay đổi các cạnh bin để họ không chồng chéo):

#sets up the axis and gets histogram data 
fig, ax1 = plt.subplots() 
ax2 = ax1.twinx() 
ax1.hist([y1, y2], color=colors) 
n, bins, patches = ax1.hist([y1,y2]) 
ax1.cla() #clear the axis 

#plots the histogram data 
width = (bins[1] - bins[0]) * 0.4 
bins_shifted = bins + width 
ax1.bar(bins[:-1], n[0], width, align='edge', color=colors[0]) 
ax2.bar(bins_shifted[:-1], n[1], width, align='edge', color=colors[1]) 

#finishes the plot 
ax1.set_ylabel("Count", color=colors[0]) 
ax2.set_ylabel("Count", color=colors[1]) 
ax1.tick_params('y', colors=colors[0]) 
ax2.tick_params('y', colors=colors[1]) 
plt.tight_layout() 
plt.show() 

hist_twin_ax

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