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】:我可以从您的代码中看到箱线图:boxplot1
和 boxplot2
在同一张图中。您需要做的是指示将有两个情节。
这可以通过
来实现-
在
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 包含之前保存的绘图内容的主要内容,如果未能解决你的问题,请参考以下文章