2012-01-05 45 views
6

Tôi đang cố gắng tạo một point and figure chart. Tôi có thể làm cho nó để làm việc in ra trên thiết bị đầu cuối nhưng tôi muốn đồ thị nó với matplotlib. Điều gì sẽ là cách tốt nhất để làm một cái gì đó như thế này? Tôi đã suy nghĩ phân tán, nhưng khi tôi làm điều này các cột được trải ra quá xa. Tôi muốn nhận được một cái gì đó giống như biểu đồ từ liên kết tôi cung cấp nơi các cột càng gần nhau càng tốt. Có một tham số tôi có thể ghi đè lên để buộc điều này? Lần đầu tiên sử dụng matplotlib vì vậy xin vui lòng tha cho tôi nếu điều này là tầm thường. Cảm ơn.Biểu đồ điểm và hình với matplotlib

+0

Nếu Jeff đang nghe ở đây, bạn nói rằng bạn đã in thành công biểu đồ P & F trên thiết bị đầu cuối. Bạn có pl. chia sẻ mã python (hoặc ít nhất là logic)? Tôi đang cố gắng phát triển biểu đồ P & F bằng Python. Nếu nó có thể được in ra trong thiết bị đầu cuối, tôi sẽ cố gắng mang nó sang định dạng HTML. Cảm ơn, – Vineet

+0

Bạn đã bao giờ nhận được một điểm làm việc và biểu đồ hình vẽ. –

Trả lời

11

Bạn có thể điều chỉnh kích thước của các biểu tượng được sử dụng trong ô phân tán bằng cách chọn sparameter. Bạn cũng có thể sẽ cần phải điều chỉnh kích thước của con số của bạn (với figsize) hoặc kích thước của trục của bạn (với add_axes). Điều này là do các biểu tượng cho phân tán là hình vuông, trong các đơn vị hiển thị và trục x và y không được điều chỉnh tự động sao cho chiều rộng-của-một-thay đổi = chiều cao-của-một-hộp.

Nói cách khác, ví dụ bạn đã cung cấp là ô hình chữ nhật có chiều cao> chiều rộng và chiều cao và chiều rộng được chọn để tạo chiều rộng-of-one-change == height-of-one-box.

Dưới đây là một ví dụ về áp dụng những kỹ thuật này:

import matplotlib.pyplot as plt 

BOX = 5 
START = 365 
changes = (8, -3, 4, -4, 12, -3, 7, -3, 5, -9, 3) 

# one way to force dimensions is to set the figure size: 
fig = plt.figure(figsize=(5, 10)) 

# another way is to control the axes dimensions 
# for axes to have specific dimensions: 
#     [ x0, y0, w, h] in figure units, from 0 to 1 
#ax = fig.add_axes([.15, .15, .7*.5, .7]) 
ax = fig.add_axes([.15, .15, .7, .7]) 

def sign(val): 
    return val/abs(val) 

pointChanges = [] 
for chg in changes: 
    pointChanges += [sign(chg)] * abs(chg) 

symbol = {-1:'o', 
      1:'x'} 

chgStart = START 
for ichg, chg in enumerate(changes): 
    x = [ichg+1] * abs(chg) 
    y = [chgStart + i * BOX * sign(chg) for i in range(abs(chg))] 
    chgStart += BOX * sign(chg) * (abs(chg)-2) 
    ax.scatter(x, y, 
       marker=symbol[sign(chg)], 
       s=175) #<----- control size of scatter symbol 

ax.set_xlim(0, len(changes)+1) 
fig.savefig('pointandfigure.png') 
plt.show() 

Phương pháp xây dựng cho từng biểu đồ phân tán là rất hackish, nhưng điểm mấu chốt là tôi cần phải chơi với các tham số phân tán s và con số kích thước có được hiệu ứng mong muốn.

Cốt truyện kết quả là:

enter image description here

Lý tưởng nhất, người ta sẽ thực hiện một phương pháp tùy chỉnh theo mô hình phương pháp phân tán. Nó sẽ tạo một tùy chỉnh Collectioninstance sẽ bao gồm nhãn x, o và tháng. Nó cũng sẽ a) tự động điều chỉnh các trục/hình khía cạnh hoặc b) tạo các ký hiệu bất đối xứng. Đây rõ ràng là một lựa chọn nâng cao, dành cho người có nhu cầu đóng góp, như một nhà phát triển, cho dự án Matplotlib.

+0

Cảm ơn bạn rất nhiều vì câu trả lời chi tiết. – Jeff

+0

+1 câu trả lời hay, được bình chọn – joaquin

0

Không có kinh nghiệm cá nhân, nhưng có thể set_view_interval() hoặc set_data_interval() từ here? Tôi đã sử dụng Matplotlib cho một dự án, nhưng không phải chơi với sửa chữa chiều rộng trục x.

+0

Bạn sẽ làm cách nào để tạo biểu đồ này nếu bạn có X và O trong một khung dữ liệu? –

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