2014-10-31 29 views
12

Có thể xuất khung dữ liệu Pandas dưới dạng tệp hình ảnh không? Một cái gì đó như df.to_png() hoặc df.to_table().savefig('table.png').Xuất khung dữ liệu Pandas dưới dạng hình ảnh bảng

Hiện tại tôi xuất khung dữ liệu bằng cách sử dụng df.to_csv(). Sau đó tôi mở tệp csv này trong Excel để làm cho dữ liệu trông đẹp và sau đó sao chép/dán bảng Excel vào Powerpoint dưới dạng hình ảnh. Tôi thấy matplotlib có phương pháp .table(), nhưng tôi đang gặp sự cố khi làm việc với df của mình.

Tôi đang sử dụng df có 5 cột & 5 hàng và mỗi 'ô' là một số.

Xin cảm ơn trước.

+0

Tại sao bạn không chỉ bao gồm bảng của bạn từ Excel trong bài thuyết trình Powerpoint của bạn, mà không cần tạo bất kỳ hình ảnh nào? –

+0

Tôi sẽ tránh sử dụng Excel hoàn toàn, tức là python => Powerpoint – user2370852

+0

Tôi không biết điều kiện tiên quyết chính xác của bạn là gì, nhưng có lẽ bạn nên suy nghĩ lại điều đó. Hiển thị dữ liệu dưới dạng hình ảnh không phải là ý tưởng hay nhất vì bạn không thể thay đổi diện mạo và kích thước sau đó, sao chép từ đó, phông chữ sẽ bị rasterized và phải mất nhiều dung lượng hơn. –

Trả lời

10

Nếu bạn có pdflatex và ImageMagick cài đặt, bạn có thể xuất DataFrame để tex, sử dụng pdflatex để chuyển đổi nó vào một tập tin pdf, và sau đó chuyển đổi pdf để png sử dụng ImageMagick:

import pandas as pd 
import numpy as np 
import subprocess 

df = pd.DataFrame({'d': [1., 1., 1., 2., 2., 2.], 
        'c': np.tile(['a', 'b', 'c'], 2), 
        'v': np.arange(1., 7.)}) 
filename = 'out.tex' 
pdffile = 'out.pdf' 
outname = 'out.png' 

template = r'''\documentclass[preview]{{standalone}} 
\usepackage{{booktabs}} 
\begin{{document}} 
{} 
\end{{document}} 
''' 

with open(filename, 'wb') as f: 
    f.write(template.format(df.to_latex())) 

subprocess.call(['pdflatex', filename]) 
subprocess.call(['convert', '-density', '300', pdffile, '-quality', '90', outname]) 

enter image description here

Nếu bạn cài đặt phantomjs và ImageMagick, bạn có thể xuất DataFrame sang HTML và sau đó sử dụng phantomjs để chuyển đổi HTML sang png, và ImageMagick để cắt kết quả:

import pandas as pd 
import numpy as np 
import subprocess 

df = pd.DataFrame({'d': [1., 1., 1., 2., 2., 2.], 
        'c': np.tile(['a', 'b', 'c'], 2), 
        'v': np.arange(1., 7.)}) 
filename = '/tmp/out.html' 
outname = '/tmp/out.png' 
cropname = '/tmp/cropped.png' 

with open(filename, 'wb') as f: 
    f.write(df.to_html()) 
rasterize = '/path/to/phantomjs/examples/rasterize.js' 
subprocess.call(['phantomjs', rasterize, filename, outname]) 
subprocess.call(['convert', outname, '-trim', cropname]) 

enter image description here

+0

Câu trả lời toàn diện. Cảm ơn! – user2370852

+1

Tôi dường như nhận được phiên bản cao su làm việc trong Python 3 bằng cách mã hóa chuỗi mủ cao su 'f.write (byte (template.format (df.to_latex()), 'UTF-8'))'. – pylang

9

Với một số mã bổ sung, bạn thậm chí có thể làm cho đầu ra nhìn phong nha:

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

Tôi nhận được lỗi 'ImportError: Không có mô-đun có tên externals'. –

+0

sáu là trong thư viện chuẩn. Tôi đã điều chỉnh câu trả lời. Nó sẽ hoạt động ngay bây giờ, cảm ơn vì đã chỉ ra. Nó là để viết mã tương thích Python 2 và Python 3. Bạn chỉ cần Python 3? – volodymyr

+0

Điều này thật tuyệt. Nhưng làm thế nào để chúng ta lưu vào một tập tin thực tế ..? – zerohedge

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