我构建了一个结果的熊猫数据框.此数据框充当表.有MultiIndexed列,每行代表一个名称,即index=['name1','name2',...]创建DataFrame时.我想显示这个表并将其保存为png(或任何图形格式).目前,我能得到的最接近的是将其转换为html,但我想要一个png.看起来有类似的问题,如如何将Pandas数据帧/系列数据保存为数字?
但是,标记的解决方案将数据帧转换为线图(而不是表格),而另一个解决方案依赖于PySide,我只想因为无法将其安装在Linux上而远离它.我希望这段代码易于移植.我真的希望使用python可以轻松创建表格.所有帮助表示赞赏.
bun*_*nji 44
Pandas允许您使用matplotlib绘制表格(详情请参见此处).通常这会将表格直接绘制到一个图表(带有轴和所有内容)上,这不是您想要的.但是,可以先删除它们:
import matplotlib.pyplot as plt
import pandas as pd
from pandas.table.plotting import table # EDIT: see deprecation warnings below
ax = plt.subplot(111, frame_on=False) # no visible frame
ax.xaxis.set_visible(False) # hide the x axis
ax.yaxis.set_visible(False) # hide the y axis
table(ax, df) # where df is your data frame
plt.savefig('mytable.png')
Run Code Online (Sandbox Code Playgroud)
输出可能不是最漂亮的,但您可以在这里找到table()函数的其他参数.还要感谢这篇文章,了解如何在matplotlib中删除轴.
在使用上述方法绘图时,这是一种模拟多索引的方法(当然是非常hacky).如果您有一个名为df的多索引数据框,它看起来像:
first second
bar one 1.991802
two 0.403415
baz one -1.024986
two -0.522366
foo one 0.350297
two -0.444106
qux one -0.472536
two 0.999393
dtype: float64
Run Code Online (Sandbox Code Playgroud)
首先重置索引,使它们成为普通列
df = df.reset_index()
df
first second 0
0 bar one 1.991802
1 bar two 0.403415
2 baz one -1.024986
3 baz two -0.522366
4 foo one 0.350297
5 foo two -0.444106
6 qux one -0.472536
7 qux two 0.999393
Run Code Online (Sandbox Code Playgroud)
通过将它们设置为空字符串来删除高阶多索引列中的所有重复项(在我的示例中,我在"first"中只有重复索引):
df.ix[df.duplicated('first') , 'first'] = ''
df
first second 0
0 bar one 1.991802
1 two 0.403415
2 baz one -1.024986
3 two -0.522366
4 foo one 0.350297
5 two -0.444106
6 qux one -0.472536
7 two 0.999393
Run Code Online (Sandbox Code Playgroud)
将"索引"上的列名更改为空字符串
new_cols = df.columns.values
new_cols[:2] = '','' # since my index columns are the two left-most on the table
df.columns = new_cols
Run Code Online (Sandbox Code Playgroud)
现在调用表函数,但将表中的所有行标签设置为空字符串(这样可以确保不显示绘图的实际索引):
table(ax, df, rowLabels=['']*df.shape[0], loc='center')
Run Code Online (Sandbox Code Playgroud)
et voila:
你不那么漂亮但功能齐全的多索引表.
Aks*_*ode 33
实际上有一个叫做dataframe_image的python库就做一个
pip install dataframe_image
Run Code Online (Sandbox Code Playgroud)
做进口
import pandas as pd
import numpy as np
import dataframe_image as dfi
df = pd.DataFrame(np.random.randn(6, 6), columns=list('ABCDEF'))
Run Code Online (Sandbox Code Playgroud)
如果需要,可以通过以下方式设置表格样式:
df_styled = df.style.background_gradient() #adding a gradient based on values in cell
Run Code Online (Sandbox Code Playgroud)
最后:
dfi.export(df_styled,"mytable.png")
Run Code Online (Sandbox Code Playgroud)
nor*_*ok2 25
您的问题的最佳解决方案可能是:
df.to_html('table.html')
subprocess.call(
'wkhtmltoimage -f png --width 0 table.html table.png', shell=True)
Run Code Online (Sandbox Code Playgroud)
但你需要得到wkhtmltoimage/ wkhtmltopdf你自己.还有一个Python软件包,pdfkit可以帮助您完成此任务,但我没有看到自己运行命令的优势.
我希望seaborn更加可定制(或者可能很容易定制:我在过去的30分钟内找不到合适的方法来修饰它).
在我的情况下,结果非常整洁,例如:
如果您愿意,可以使用CSS进一步自定义.
jcd*_*ing 12
虽然我不确定这是否是您期望的结果,但您可以通过在带有注释的Seaborn Heatmap上绘制DataFrame来保存您的DataFrame,如下所示:
http://stanford.edu/~mwaskom/software/seaborn/generated/seaborn.heatmap.html#seaborn.heatmap
它可以立即使用Pandas Dataframe.您可以查看此示例:使用Python有效地以csv格式绘制表格
您可能想要更改色彩映射,使其仅显示白色背景.
希望这可以帮助.
And*_*ndi 11
有一个名为 https://pypi.org/project/df2img/ 的 Python 库df2img(免责声明:我是作者)。它是一个用作plotly后端的包装器/便利函数。
import pandas as pd
import df2img
df = pd.DataFrame(
data=dict(
float_col=[1.4, float("NaN"), 250, 24.65],
str_col=("string1", "string2", float("NaN"), "string4"),
),
index=["row1", "row2", "row3", "row4"],
)
Run Code Online (Sandbox Code Playgroud)
将 a 保存pd.DataFrame为 .png 文件可以相当快地完成。您可以应用格式设置,例如背景颜色或交替行颜色以获得更好的可读性。
fig = df2img.plot_dataframe(
df,
title=dict(
font_color="darkred",
font_family="Times New Roman",
font_size=16,
text="This is a title",
),
tbl_header=dict(
align="right",
fill_color="blue",
font_color="white",
font_size=10,
line_color="darkslategray",
),
tbl_cells=dict(
align="right",
line_color="darkslategray",
),
row_fill_color=("#ffffff", "#d7d8d6"),
fig_size=(300, 160),
)
df2img.save_dataframe(fig=fig, filename="plot.png")
Run Code Online (Sandbox Code Playgroud)
我对我正在做的项目有同样的要求。但是没有一个答案符合我的要求。这是最终帮助我的东西,可能对这种情况有用:
from bokeh.io import export_png, export_svgs
from bokeh.models import ColumnDataSource, DataTable, TableColumn
def save_df_as_image(df, path):
source = ColumnDataSource(df)
df_columns = [df.index.name]
df_columns.extend(df.columns.values)
columns_for_table=[]
for column in df_columns:
columns_for_table.append(TableColumn(field=column, title=column))
data_table = DataTable(source=source, columns=columns_for_table,height_policy="auto",width_policy="auto",index_position=None)
export_png(data_table, filename = path)
Run Code Online (Sandbox Code Playgroud)
@bunji的解决方案适用于我,但默认选项并非总能带来良好的效果。我添加了一些有用的参数来调整表的外观。
import pandas as pd
import matplotlib.pyplot as plt
from pandas.tools.plotting import table
import numpy as np
dates = pd.date_range('20130101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=list('ABCD'))
df.index = [item.strftime('%Y-%m-%d') for item in df.index] # Format date
fig, ax = plt.subplots(figsize=(12, 2)) # set size frame
ax.xaxis.set_visible(False) # hide the x axis
ax.yaxis.set_visible(False) # hide the y axis
ax.set_frame_on(False) # no visible frame, uncomment if size is ok
tabla = table(ax, df, loc='upper right', colWidths=[0.17]*len(df.columns)) # where df is your data frame
tabla.auto_set_font_size(False) # Activate set fontsize manually
tabla.set_fontsize(12) # if ++fontsize is necessary ++colWidths
tabla.scale(1.2, 1.2) # change size table
plt.savefig('table.png', transparent=True)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
64570 次 |
| 最近记录: |