2012-11-05 3 views
3

저는 다중 선 그래프를위한 파이썬 자동화를 개발하고 있습니다. 다음은 Excel에서 수동으로 작성하는 예제입니다.python - matplotlib - 결과 요약이있는 다중 행 그래프 만들기

plt = pyplot 
    plt.plot(channel_list, udp_dl_values, label="UDP DL") 
    plt.plot(channel_list, tcp_dl_values, label="TCP DL") 
    plt.plot(channel_list, udp_ul_values, label="UDP UL") 
    plt.plot(channel_list, tcp_ul_values, label="TCP UL") 
    plt.grid() 

내가 스크립트를 사용하여 이상 만들 수 있는지 궁금 다음과 같이

Example Chart

나의 현재 코드는? 이 예는 기본하기 matplotlib 색상 사이클을 사용하여 단순화 할 수있다 (파란색, 빨간색, 녹색 :

감사합니다,

Parth

+1

여기 어딘가에서 질문이 있습니까? – Gerrat

+0

당신은 거의 확실하게 그래프를 이미지로 생성 한 다음 가져 와서 gui 키트 (wx/TK/qt/etc) 중 하나를 사용하여 이미지를 창에 넣고 그 아래에 테이블을 놓아야합니다 (다소 사소한 것) ... 양자 택일로 win32 API와 xcom 객체를 직접보고 엑셀로 직접 대화하고 엑셀로 얻을 수 있습니다 (자명하지 않습니다) –

+2

또는 http://stackoverflow.com/questions/8524401/을 볼 수 없습니다. matplotlib에서 플롯 할 수있는 방법 - –

답변

7

http://matplotlib.org/users/screenshots.html#table-demo

#!/usr/bin/env python 
import matplotlib 

from pylab import * 
from matplotlib.colors import colorConverter 


#Some simple functions to generate colours. 
def pastel(colour, weight=2.4): 
    """ Convert colour into a nice pastel shade""" 
    rgb = asarray(colorConverter.to_rgb(colour)) 
    # scale colour 
    maxc = max(rgb) 
    if maxc < 1.0 and maxc > 0: 
     # scale colour 
     scale = 1.0/maxc 
     rgb = rgb * scale 
    # now decrease saturation 
    total = sum(rgb) 
    slack = 0 
    for x in rgb: 
     slack += 1.0 - x 

    # want to increase weight from total to weight 
    # pick x s.t. slack * x == weight - total 
    # x = (weight - total)/slack 
    x = (weight - total)/slack 

    rgb = [c + (x * (1.0-c)) for c in rgb] 

    return rgb 

def get_colours(n): 
    """ Return n pastel colours. """ 
    base = asarray([[1,0,0], [0,1,0], [0,0,1]]) 

    if n <= 3: 
     return base[0:n] 

    # how many new colours to we need to insert between 
    # red and green and between green and blue? 
    needed = (((n - 3) + 1)/2, (n - 3)/2) 

    colours = [] 
    for start in (0, 1): 
     for x in linspace(0, 1, needed[start]+2): 
      colours.append((base[start] * (1.0 - x)) + 
          (base[start+1] * x)) 

    return [pastel(c) for c in colours[0:n]] 



axes([0.2, 0.2, 0.7, 0.6]) # leave room below the axes for the table 

data = [[ 66386, 174296, 75131, 577908, 32015], 
     [ 58230, 381139, 78045, 99308, 160454], 
     [ 89135, 80552, 152558, 497981, 603535], 
     [ 78415, 81858, 150656, 193263, 69638], 
     [ 139361, 331509, 343164, 781380, 52269]] 

colLabels = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail') 
rowLabels = ['%d year' % x for x in (100, 50, 20, 10, 5)] 

# Get some pastel shades for the colours 
colours = get_colours(len(colLabels)) 
colours.reverse() 
rows = len(data) 

ind = arange(len(colLabels)) + 0.3 # the x locations for the groups 
cellText = [] 
width = 0.4  # the width of the bars 
yoff = array([0.0] * len(colLabels)) # the bottom values for stacked bar chart 
for row in xrange(rows): 
    bar(ind, data[row], width, bottom=yoff, color=colours[row]) 
    yoff = yoff + data[row] 
    cellText.append(['%1.1f' % (x/1000.0) for x in yoff]) 

# Add a table at the bottom of the axes 
colours.reverse() 
cellText.reverse() 
the_table = table(cellText=cellText, 
        rowLabels=rowLabels, rowColours=colours, 
        colLabels=colLabels, 
        loc='bottom') 
ylabel("Loss $1000's") 
vals = arange(0, 2500, 500) 
yticks(vals*1000, ['%d' % val for val in vals]) 
xticks([]) 
title('Loss by Disaster') 

show() 

example plot with bars

편집에서 , ....) 및 라인 플롯은 다음과 같습니다 :

,
import numpy as np 
import matplotlib.pyplot as plt 

#Create a figure and axes with room for the table 
fig = plt.figure() 
ax = plt.axes([0.2, 0.2, 0.7, 0.6]) 

#Create labels for the rows and columns as tuples 
colLabels = ('36', '40', '44', '48', '149', '153', '157', '161', '165') 
rowLabels = ('UDL DL', 'UDP UL', 'TCP DL', 'TCP UL') 

#Table data as a numpy array 
tableData = np.array([[ 36.7128, 37.684, 38.283, 48.425, 32.839, 36.424, 34.440, 31.642, 35.710], 
     [ 36.7128, 37.684, 38.283, 48.425, 32.839, 36.424, 34.440, 31.642, 35.710], 
     [ 36.7128, 37.684, 38.283, 48.425, 32.839, 36.424, 34.440, 31.642, 35.710], 
     [ 36.7128, 37.684, 38.283, 48.425, 32.839, 36.424, 34.440, 31.642, 35.710]]) 

#Get the current color cycle as a list, then reset the cycle to be at the beginning 
colors = []  
while True: 
    colors.append(ax._get_lines.color_cycle.next()) 
    if colors[0] == colors[-1] and len(colors)>1: 
     colors.pop(-1) 
     break 

for i in xrange(len(colors)-1): 
    ax._get_lines.color_cycle.next() 

#Show the table 
table = plt.table(cellText=tableData, 
        rowLabels=rowLabels, rowColours=colors, 
        colLabels=colLabels, 
        loc='bottom') 

#Make some line plots 
x = np.linspace(0,10,100)     
ax.plot(x,np.sin(x)) 
ax.plot(x,-1*np.sin(x)) 
ax.plot(x,np.cos(x)) 
ax.plot(x,-1*np.cos(x)) 

#Turn off x-axis ticks and show the plot    
plt.xticks([]) 
plt.show() 

Example plot with lines

+0

감사합니다.하지만이 질문에서 yoff의 목적은 무엇입니까? – Parth

+0

@ ParthG X 축 레이블에서 각 새 행을 더 아래로 밀어주는 오프셋이라고 생각합니다. –

+0

@PaulH 선의 음모에서이 속성을 작동하지 못하는 것 같습니다. – Parth