首页 > 解决方案 > 跨模块的 Matplotlib 导入问题

问题描述

我正在制作一个数据可视化项目,该项目从文件中获取输入数据并输出一组数字。让我们坐下来,我有 3 个不同的模块,每个模块都导入了 matplotlib,然后我在 main.py 文件中使用

# main.py file
from wc import make_wordcloud
from weekday_vis import make_week_vis
from chat_activity import timeline

print("Creating WordCloud ...")
make_wordcloud()

print("Creating weekday visualization ...")
weekday_vis.make_week_vis()

print("Creating Timeline ...")
timeline()

当我单独测试每个模块时,它们生成的图像运行良好,但是当我将它们放入 main.py 时,基本上一切都搞砸了。

这是我的词云文件中的代码

def make_wc_figure():
    #text processing code omitted
    
    wordcloud = WordCloud(width=2000, height=1000).generate(with_string)
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.figure(figsize=(20, 10), facecolor='k')
    plt.axis("off")
    plt.tight_layout(pad=0)
    plt.savefig("output/wordcloud.png")

这是在 weekday_vis

def make_figure():
    #data processing code omitted
    week_chart = sns.barplot(df_day.index, df_day.values, alpha=0.8, palette='rocket', order=order)
    week_chart.set(xlabel='Weekdays', ylabel='Messages')
    plt.savefig("output/week_vis.png")
    

这在聊天活动中

def timeline():
    #data processing code omitted
    plt.figure(figsize=(20, 10))
    sns.set_context("paper")
    chart = sns.barplot(final_data["Date"], final_data["Messages"], alpha=1, palette='husl', data=final_data)
    chart.set(xlabel='Timeline', ylabel='Messages')
    chart.set_xticklabels(final_labels, rotation=90, fontweight='light', horizontalalignment='center', fontsize=6)
    plt.tight_layout()
    plt.savefig("output/timeline.png")

我相信这是因为 plt 导入但不知道如何纠正它。有什么办法可以使这项工作?谢谢

标签: pythonmatplotlibimportdata-visualization

解决方案


您需要figure通过传递不同的整数为每个图创建一个新的。

例如,

print("Creating WordCloud ...")
make_wordcloud(1)

print("Creating weekday visualization ...")
weekday_vis.make_week_vis(2)

print("Creating Timeline ...")
timeline(3)

然后,您需要在函数中使用整数来创建不同的图。

def make_wc_figure(p_num):
    ...
    plt.figure(num=p_num, figsize=(20, 10), facecolor='k')
    ...

def make_figure(p_num):
    ...
    plt.figure(num=p_num)
    ...

def timeline(p_num):
    ...
    plt.figure(num=p_num, figsize=(20, 10))
    ...

如您所见,这是对您的问题的一种快速而肮脏的解决方法。如果您只想这样做一次,那么只需像这样进行即可。但是,建议使用面向对象的方法来重构您的代码。


推荐阅读