2013-11-01 27 views
29

這聽起來有點不可思議,但我需要將Pandas控制檯輸出字符串保存爲png圖片。例如:如何將Pandas數據框/系列數據保存爲圖形?

>>> df 
        sales net_pft  ROE ROIC 
STK_ID RPT_Date         
600809 20120331 22.1401 4.9253 0.1651 0.6656 
     20120630 38.1565 7.8684 0.2567 1.0385 
     20120930 52.5098 12.4338 0.3587 1.2867 
     20121231 64.7876 13.2731 0.3736 1.2205 
     20130331 27.9517 7.5182 0.1745 0.3723 
     20130630 40.6460 9.8572 0.2560 0.4290 
     20130930 53.0501 11.8605 0.2927 0.4369 

有沒有辦法像df.output_as_png(filename='df_data.png')產生一個PIC文件,該文件只是顯示上述內容裏面?

+0

看到這個答案的第二部分:HTTP: //stackoverflow.com/a/10195347/1755432 目前沒有簡單的方法,比如'df.plot(how ='table')''。 –

+0

謝謝。有點解決這個問題。 – bigbug

+1

@bigbug,你可以發佈答案並將其標記爲已解決嗎? – gabra

回答

15

我會使用matplotlib表的功能,有一些額外的造型:

import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
import six 

df = pd.DataFrame() 
df['date'] = ['2016-04-01', '2016-04-02', '2016-04-03'] 
df['calories'] = [2200, 2100, 1500] 
df['sleep hours'] = [2200, 2100, 1500] 
df['gym'] = [True, False, False] 

def render_mpl_table(data, col_width=3.0, row_height=0.625, font_size=14, 
        header_color='#40466e', row_colors=['#f1f1f2', 'w'], edge_color='w', 
        bbox=[0, 0, 1, 1], header_columns=0, 
        ax=None, **kwargs): 
    if ax is None: 
     size = (np.array(data.shape[::-1]) + np.array([0, 1])) * np.array([col_width, row_height]) 
     fig, ax = plt.subplots(figsize=size) 
     ax.axis('off') 

    mpl_table = ax.table(cellText=data.values, bbox=bbox, colLabels=data.columns, **kwargs) 

    mpl_table.auto_set_font_size(False) 
    mpl_table.set_fontsize(font_size) 

    for k, cell in six.iteritems(mpl_table._cells): 
     cell.set_edgecolor(edge_color) 
     if k[0] == 0 or k[1] < header_columns: 
      cell.set_text_props(weight='bold', color='w') 
      cell.set_facecolor(header_color) 
     else: 
      cell.set_facecolor(row_colors[k[0]%len(row_colors) ]) 
    return ax 

render_mpl_table(df, header_columns=0, col_width=2.0) 

enter image description here

+0

你的代碼對我來說工作得很好,謝謝。你還可以添加一些方法來改變一列的寬度 - 例如,我在最左邊的列中有很長的'標籤'字符串,並且希望它比其他列寬。 – Robert

+0

所有你需要做的就是改變'size'數組是代碼的方式。 – volodymyr

2

這是一個有點駭人聽聞的解決方案,但它完成了工作。

import numpy as np 
import pandas as pd 
from matplotlib.backends.backend_pdf import PdfPages 
import matplotlib.pyplot as plt 

from PySide.QtGui import QImage 
from PySide.QtGui import QPainter 
from PySide.QtCore import QSize 
from PySide.QtWebKit import QWebPage 

arrays = [np.hstack([ ['one']*3, ['two']*3]), ['Dog', 'Bird', 'Cat']*2] 
columns = pd.MultiIndex.from_arrays(arrays, names=['foo', 'bar']) 
df =pd.DataFrame(np.zeros((3,6)),columns=columns,index=pd.date_range('20000103',periods=3)) 

h = "<!DOCTYPE html> <html> <body> <p> " + df.to_html() + " </p> </body> </html>"; 
page = QWebPage() 
page.setViewportSize(QSize(5000,5000)) 

frame = page.mainFrame() 
frame.setHtml(h, "text/html") 

img = QImage(1000,700, QImage.Format(5)) 
painter = QPainter(img) 
frame.render(painter) 
painter.end() 
a = img.save("html.png") 
35

你必須使用由DataFrame.plot()命令返回的數字:

ax = df.plot() 
fig = ax.get_figure() 
fig.savefig('asdf.png') 
+7

OP似乎有興趣保存表格描述,而不是情節。 – ivotron

+1

使用Python 3.x會返回「'numpy.ndarray'對象沒有屬性'get_figure'」。 – Pat

4

我很感興趣,救了我的數據框的表爲報告的附錄中。我發現這是最簡單的解決方案:

import pandas as pd 
from matplotlib.backends.backend_pdf import PdfPages 
import matplotlib.pyplot as plt 

# Assuming that you have a dataframe, df 
pp = PdfPages('Appendix_A.pdf') 
total_rows, total_cols = df.shape; #There were 3 columns in my df 

rows_per_page = 40; # Assign a page cut off length 
rows_printed = 0 
page_number = 1; 

while (total_rows >0): 
    #put the table on a correctly sized figure  
    fig=plt.figure(figsize=(8.5, 11)) 
    plt.gca().axis('off') 
    matplotlib_tab = pd.tools.plotting.table(plt.gca(),df.iloc[rows_printed:rows_printed+rows_per_page], 
     loc='upper center', colWidths=[0.2, 0.2, 0.2])  

    # Give you cells some styling 
    table_props=matplotlib_tab.properties() 
    table_cells=table_props['child_artists'] # I have no clue why child_artists works 
    for cell in table_cells: 
     cell.set_height(0.024) 
     cell.set_fontsize(12) 

    # Add a header and footer with page number 
    fig.text(4.25/8.5, 10.5/11., "Appendix A", ha='center', fontsize=12) 
    fig.text(4.25/8.5, 0.5/11., 'A'+str(page_number), ha='center', fontsize=12) 

    pp.savefig() 
    plt.close() 

    #Update variables 
    rows_printed += rows_per_page; 
    total_rows -= rows_per_page; 
    page_number+=1; 

pp.close() 
相關問題