pandas boxplot 包含之前保存的绘图内容

Posted

技术标签:

【中文标题】pandas boxplot 包含之前保存的绘图内容【英文标题】:pandas boxplot contains content of plot saved before 【发布时间】:2021-09-29 07:39:07 【问题描述】:

我正在将 datafame 的一些列绘制成箱线图。到目前为止,没有问题。如下所示,我写了一些东西并且它有效。但是:第二个情节也包含第一个情节的情节。如您所见,我尝试使用“= None”或“del value”,但它不起作用。将绘图功能放在外面也不能解决问题。

我的代码有什么问题?

这是一个可执行的例子

 import pandas as pd 
 
 d1 = 'ff_opt_time': [10, 20, 11, 5, 15 , 13, 19, 25  ], 'ff_count_opt': [30, 40, 45, 29, 35,38,32,41]
 df1 = pd.DataFrame(data=d1)
 d2 = 'ff_opt_time': [1, 2, 1, 5, 1 , 1, 4, 5  ], 'ff_count_opt': [3, 4, 4, 9, 5,3, 2,4]
 df2 = pd.DataFrame(data=d2)
 
 def evaluate2(df1, df2):
    
     def plot(df, output ):
         boxplot = df.boxplot(rot=45,fontsize=5)
         fig = boxplot.get_figure()
         fig.savefig(output + ".pdf")
     
     df_ot = pd.DataFrame(columns=['opt_time1' , 'opt_time2'])
     df_ot['opt_time1'] = df1['ff_opt_time']
     df_ot['opt_time2'] = df2['ff_opt_time']
     plot(df_ot, "bp_opt_time")
 
     df_op = pd.DataFrame(columns=['count_opt1' , 'count_opt2'])
     df_op['count_opt1'] = df1['ff_count_opt']
     df_op['count_opt2'] = df2['ff_count_opt']
     plot(df_op, "bp_count_opt_perm")    
 
 evaluate2(df1, df2)

这是另一个可执行示例。我什至使用了其他变量名。

import pandas as pd 

d1 = 'ff_opt_time': [10, 20, 11, 5, 15 , 13, 19, 25  ], 'ff_count_opt': [30, 40, 45, 29, 35,38,32,41]
df1 = pd.DataFrame(data=d1)
d2 = 'ff_opt_time': [1, 2, 1, 5, 1 , 1, 4, 5  ], 'ff_count_opt': [3, 4, 4, 9, 5,3, 2,4]
df2 = pd.DataFrame(data=d2)

def evaluate2(df1, df2):

    df_ot = pd.DataFrame(columns=['opt_time1' , 'opt_time2'])
    df_ot['opt_time1'] = df1['ff_opt_time']
    df_ot['opt_time2'] = df2['ff_opt_time']
    boxplot1 = df_ot.boxplot(rot=45,fontsize=5)
    fig1 = boxplot1.get_figure()
    fig1.savefig( "bp_opt_time.pdf")

    df_op = pd.DataFrame(columns=['count_opt1' , 'count_opt2'])
    df_op['count_opt1'] = df1['ff_count_opt']
    df_op['count_opt2'] = df2['ff_count_opt']
    boxplot2 = df_op.boxplot(rot=45,fontsize=5)
    fig2 = boxplot2.get_figure()
    fig2.savefig( "bp_count_opt_perm.pdf")

evaluate2(df1, df2)

【问题讨论】:

【参考方案1】:

我可以从您的代码中看到箱线图:boxplot1boxplot2 在同一张图中。您需要做的是指示将有两个情节。

这可以通过

来实现
    matplotlib 中使用pyplot 创建两个子图,此代码使用ax1 指定要放入该轴的箱线图和fig2 指定箱线图图来实现fig1, ax1 = plt.subplots() 的作用 在 jupyter notebook 的不同单元格中分解 evaluate2 函数并分别执行箱线图

解决方案 1:使用pyplot 的两个子图

import pandas as pd 
import matplotlib.pyplot as plt

d1 = 'ff_opt_time': [10, 20, 11, 5, 15 , 13, 19, 25  ], 'ff_count_opt': [30, 40, 45, 29, 35,38,32,41]
df1 = pd.DataFrame(data=d1)
d2 = 'ff_opt_time': [1, 2, 1, 5, 1 , 1, 4, 5  ], 'ff_count_opt': [3, 4, 4, 9, 5,3, 2,4]
df2 = pd.DataFrame(data=d2)

def evaluate2(df1, df2):
    df_ot = pd.DataFrame(columns=['opt_time1' , 'opt_time2'])
    df_ot['opt_time1'] = df1['ff_opt_time']
    df_ot['opt_time2'] = df2['ff_opt_time']
    fig1, ax1 = plt.subplots() 
    boxplot1 = df_ot.boxplot(rot=45,fontsize=5)
    ax1=boxplot1
    fig1 = boxplot1.get_figure()
    fig1.savefig( "bp_opt_time.pdf")

    df_op = pd.DataFrame(columns=['count_opt1' , 'count_opt2'])
    df_op['count_opt1'] = df1['ff_count_opt']
    df_op['count_opt2'] = df2['ff_count_opt']
    fig2, ax2 = plt.subplots()
    boxplot2 = df_op.boxplot(rot=45,fontsize=5)
    fig2 = boxplot2.get_figure()
    ax2=boxplot2
    fig2.savefig( "bp_count_opt_perm.pdf")
    plt.show()
evaluate2(df1, df2)

解决方案 2:在不同的单元格中执行箱线图

基于 cmets 的更新:清除地块

两种方法可以清除剧情,

使用clf() 绘制自己 matplotlib.pyplot.clf() 清除当前Figure状态而不关闭它的函数

使用cla() 清除坐标区 matplotlib.pyplot.cla() 函数清除当前 Axes 状态而不关闭 Axes。

调用fig.save后只需调用plt.clf()函数

阅读this documentation on how to clear a plot in Python using matplotlib

【讨论】:

嘿,谢谢!这看起来不错,但代码只是一个示例。我必须用 20 个地块来做到这一点。如何使用我的绘图功能? 图保存为pdf后有没有办法删除? @theother 取决于 (1) 你为什么要保存剧情是为了以后看? (2) 当你说 20 个图时,是不是有 20 个数据框和 20 个列名? 我不使用 jupyter 或其他一些想法。我只是运行一个脚本来创建绘图,这些绘图保存为 pdf 或 svg。有两个数据框作为参数。正如我用这两个情节展示的那样,将会有更多情节。比如“worse_time”和“count_worse”等一些数据…… 当您提到 20 个图时,您指的是数据框中的 20 列吗?如果是这样,您可以使用此脚本并通过添加其他 18 列来根据您的用例进行修改。【参考方案2】:

只需从 Archana David 获取代码并将其放入您的绘图函数中:目标是调用“fig, ax = plt.subplots()”来创建一个新图。

import pandas as pd
import matplotlib.pyplot as plt
d1 = 'ff_opt_time': [10, 20, 11, 5, 15, 13, 19, 25],
    'ff_count_opt': [30, 40, 45, 29, 35, 38, 32, 41]
df1 = pd.DataFrame(data=d1)
d2 = 'ff_opt_time': [1, 2, 1, 5, 1, 1, 4, 5],
    'ff_count_opt': [3, 4, 4, 9, 5, 3, 2, 4]
df2 = pd.DataFrame(data=d2)
def evaluate2(df1, df2):
    def plot(df, output):
    fig, ax = plt.subplots()
    boxplot = df.boxplot(rot=45, fontsize=5)
    ax = boxplot
    fig = boxplot.get_figure()
    fig.savefig(output + ".pdf")

    df_ot = pd.DataFrame(columns=['opt_time1', 'opt_time2'])
    df_ot['opt_time1'] = df1['ff_opt_time']
    df_ot['opt_time2'] = df2['ff_opt_time']
    plot(df_ot, "bp_opt_time")

    df_op = pd.DataFrame(columns=['count_opt1' , 'count_opt2'])
    df_op['count_opt1'] = df1['ff_count_opt']
    df_op['count_opt2'] = df2['ff_count_opt']
    plot(df_op, "bp_count_opt_perm")    

evaluate2(df1, df2)

【讨论】:

以上是关于pandas boxplot 包含之前保存的绘图内容的主要内容,如果未能解决你的问题,请参考以下文章

R语言boxplot大样本分组绘图

对pandas的dataframe绘图并保存

对pandas的dataframe绘图并保存

来自 DataFrames 的点箱图

Pandas boxplot并排显示不同的DataFrame

python - 如何用pandas包为python制作的子图冲掉boxplot的默认副标题