【问题标题】:How can I return scatterplot with axes and data?如何返回带有轴和数据的散点图?
【发布时间】:2020-07-20 18:32:59
【问题描述】:

这个问题来自我的培训班,我只能在方法 def draw_scatterplot(df) 中添加代码。 使用 Anaconda Spyder、Python 3.8.3、Seaborn 0.10.1、Matplotlib 3.1.3。 如何从我的函数 def draw_scatterplot(df) 返回带有坐标轴和数据的绘图?

import pandas as pd
import matplotlib 
matplotlib.use('Agg') 
import seaborn as sns 
import pickle 

def draw_scatterplot(df): 
    '''
    Returns a scatter plot.  
    '''
    # Create a scatter plot using Seaborn showing trend of A with B
    # for C.  Set the plot size to 10 inches in width and 2 inches 
    # in height respectively.

    # add your code below
    fig, ax1 = matplotlib.pyplot.subplots(figsize=(10,2))
    ax2 = sns.scatterplot(x='A', y='B', data=df, ax=ax1, hue='C')
    return fig

def serialize_plot(plot, plot_dump_file): 
    with open(plot_dump_file, mode='w+b') as fp: 
        pickle.dump(plot, fp) 

def main(): 
    df = pd.DataFrame(...) 
    plot2 = draw_scatterplot(df) 
    serialize_plot(plot2.axes, "plot2_axes.pk") 
    serialize_plot(plot2.data, "plot2_data.pk") 


> Error: Traceback (most recent call last):
> 
>   File "myscatterplot.py", line 265, in <module>
>     main()
> 
>   File "myscatterplot.py", line 255, in main
>     serialize_plot(plot2.data, "plot2_data.pk")
> 
> AttributeError: 'Figure' object has no attribute 'data'

我也尝试过返回轴:

def draw_scatterplot(df): 
    '''
    Returns a scatter plot
    '''
    fig, ax1 = matplotlib.pyplot.subplots(figsize=(10,2))
    ax2 = sns.scatterplot(x='A', y='B', data=df, ax=ax1, hue='C')
    return ax2

Error:
AttributeError: 'AxesSubplot' object has no attribute 'data'

对于返回的图形和轴,serialize_plot(plot2.axes, "plot2_axes.pk") 正在工作, 当轴从函数返回时,我看到文件"plot2_axes.pk" 已创建。

【问题讨论】:

    标签: python matplotlib seaborn pickle


    【解决方案1】:

    要从函数返回整个图表,您可以返回 fig 变量。它包含所有需要的信息。

    import pandas as pd
    import matplotlib 
    import seaborn as sns 
    import pickle 
    
    def draw_scatterplot(df): 
        '''
        Returns a scatter plot
        '''
        fig, ax1 = matplotlib.pyplot.subplots(figsize=(10,2))
        ax2 = sns.scatterplot(x='A', y='B', data=df, ax=ax1, hue='C')
    #     return ax2
        return fig
    
    def serialize_plot(plot, plot_dump_file): 
        with open(plot_dump_file, mode='w+b') as fp: 
            pickle.dump(plot, fp) 
    
    def main(): 
        df = pd.DataFrame({"A":[1,2,3], "B":[6,2,7], "C":[1,0,1]}) 
        plot2 = draw_scatterplot(df) 
    
    main()
    

    (我正在使用 juypter 笔记本。因此调用 main 而没有 plot2.show

    输出:

    我知道你最终想把你的身材丢进泡菜里。为此,您可以直接转储plot2(图),不需要plot2.data 或类似的东西。

    def main(): 
        df = pd.DataFrame(...) 
        plot2 = draw_scatterplot(df) 
        serialize_plot(plot2, "plot2.pk")
    

    【讨论】:

    • 感谢 Roim 的回答!我正在尝试解决我在培训课程中给出的这个问题。我只能更改方法 def draw_scatterplot(df) 中的代码。
    • 你的意思是serialize_plot(plot2.data, "plot2_data.pk") 无论如何都会被调用?如果是这样,请编辑您的问题以澄清这一点
    • 谢谢罗伊姆。我在上面编辑了我的问题。你是对的serialize_plot(plot2.data, "plot2_data.pk") 无论如何都会被调用。
    • @vin 我有点困惑。请提供更多详细信息:您必须使用seaborn吗?它必须是散点图吗?您转储的数据到底需要是什么?如果这是锻炼的一部分,那么了解更广泛的范围可能会有所帮助。 seaborn 的散点图中没有“数据”属性
    • 我也对这个问题感到困惑。根据问题,需要使用 Seaborn 创建散点图。我也试过sns.regplot。我看到了提取数据的帖子get_offsets()stackoverflow.com/a/27852570。我错过了一些东西......
    【解决方案2】:

    我更新了如下方法,现在没有收到错误。

    def draw_scatterplot(df): 
    '''
    Returns a scatter plot
    '''
    fig, ax1 = matplotlib.pyplot.subplots(figsize=(10,2))
    ax2 = sns.scatterplot(x='A', y='B', data=df, ax=ax1, hue='C')
    # return ax2
    fig.data = df
    return fig
    

    【讨论】:

    • 虽然尝试相同,但它有效,但我收到 TypeError: 'AxesSubplot' 对象不支持索引,如果你有答案,你能帮忙吗
    • 提示:使用seaborn.pydata.org/api.html中列出的不同方法
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2013-02-12
    • 1970-01-01
    • 2018-11-18
    • 2014-11-07
    相关资源
    最近更新 更多