【问题标题】:Overlapping of multiple plots with mathplotlib使用 matplotlib 重叠多个图
【发布时间】:2020-10-25 20:25:49
【问题描述】:

我正在使用 Django 构建一个 Web 应用程序,它可以选择绘制直方图、散点图、条形图等图表

使用 matplotlib 库,我正在绘制绘图并将绘图渲染到 HTML 页面。

plt.figure()
plt.title("xyz")
plt.tight_layout()
plt.plot(x,y, 'b')   
plt.plot(x,z, 'r')    
buf = BytesIO()
fig = plt.gcf()
fig.set_size_inches(12,8, forward=True)
fig.savefig(buf, format='png')
plt.clf()

# Get Image
image_base64 = base64.b64encode(
    buf.getvalue()).decode('utf-8').replace('\n', '')

img_src = 'data:image/png;base64, {}'.format(image_base64)

当用户发送两个不同的请求以绘制不同的图时,图例和数据点等内容会与其他图混合并导致图重叠。在附图中,左侧的情节应该与右侧的情节相似。但是不同的绘图请求的内容会附加到这个响应中并显示在这个响应中。

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    这是因为plt 被多次重复使用。这样的事情应该会有所帮助..

    def simple(request):
        import random
        import django
        import datetime
    
        from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas
        from matplotlib.figure import Figure
        from matplotlib.dates import DateFormatter
    
        fig=Figure()
        ax=fig.add_subplot(111)
        x=[]
        y=[]
        now=datetime.datetime.now()
        delta=datetime.timedelta(days=1)
        for i in range(10):
            x.append(now)
            now+=delta
            y.append(random.randint(0, 1000))
        ax.plot_date(x, y, '-')
        ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))
        fig.autofmt_xdate()
        canvas=FigureCanvas(fig)
        response=django.http.HttpResponse(content_type='image/png')
        canvas.print_png(response)
        return response
    

    Source

    【讨论】:

    • 这只是一个演示,展示了在 django 中使用 matplotlib..根据您的需要随意定制它
    • 我能够绘制图像并将其呈现到 HTML 页面。但是,如果我在多种类型的图中有类似的实现,并且用户并行请求它们,则一个响应的内容与另一个响应的内容混合在一起,如查询中所附图像所示
    【解决方案2】:

    这是因为您将两个图表绘制在同一个上。对于 matplotlib,这意味着:“这是一张画布,请在上面画两张图”。

    如果您希望将它们拆分,则:

    【讨论】:

    • 对不起,我没有在查询中说清楚,问题是如果我通过发送输入 X、Y、Z 在一个请求中请求条形图并通过发送在另一个请求中请求散点图输入 W, Y, Z 条形图和散点图的内容混淆了。在条形图中显示散点图,条形图中的内容显示在散点图中。
    【解决方案3】:

    我有同样的问题,但使用 Flask。只需插入 plt.close(),在 plt.save 之后。问题解决了。

    【讨论】:

    • plt.save 在哪里?
    猜你喜欢
    • 1970-01-01
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2011-03-14
    • 2013-01-08
    • 2012-09-26
    • 1970-01-01
    相关资源
    最近更新 更多