代码之家  ›  专栏  ›  技术社区  ›  Evan McFarland

Matplotlib传奇不会出现

  •  0
  • Evan McFarland  · 技术社区  · 4 年前

    我尝试的每一个选择都没有让传奇在我的情节中展现出来。请帮忙。这是代码,当我的所有输入都是简单的NumPy数组时,绘图效果很好。添加图例函数时,角落里会出现一个小框,这样我就知道指令正在运行,但里面什么都没有。我正在使用Jupyter Notebook,我的其他尝试显示在后面 # .有人能发现这个缺陷吗:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    ratios = ['Share Price', 'PEG', 'Price to Sales']
    final_z_scores = np.transpose(final_z_scores)
    print(final_z_scores)
    
    fig = plt.figure(figsize=(6,4))
    
    #plt.plot(ratios, final_z_scores[0], ratios, final_z_scores[1], ratios, final_z_scores[2])
    first = plt.plot(ratios, final_z_scores[0])
    second = plt.plot(ratios, final_z_scores[1])
    
    #ax.legend((first, second), ('oscillatory', 'damped'), loc='upper right', shadow=True)
    ax.legend((first, second), ('label1', 'label2'))
    plt.xlabel('Ratio Types')
    plt.ylabel('Values')
    plt.title('Final Comparisons of Stock Ratios')
    plt.legend(loc='upper left')
    
    plt.plot()
    plt.show()
    
    2 回复  |  直到 4 年前
        1
  •  6
  •   Trenton McKinney ivirshup    2 年前

    打电话 plt.legend() 没有具体说明 handles labels 明确遵守所概述的此调用签名的描述 here :

    当您不传递任何额外参数时,将自动确定要添加到图例中的元素。

    在这种情况下,标签取自艺术家。您可以在艺术家创作时指定它们,也可以通过调用 set_label() 艺术家的方法:

    因此,为了在您的示例中自动填充图例,您只需为不同的图分配标签:

    import pandas as pd
    import matplotlib.pyplot as plt
    
    ratios = ['Share Price', 'PEG', 'Price to Sales']
    final_z_scores = np.transpose(final_z_scores)
    
    fig = plt.figure(figsize=(6,4))
    first = plt.plot(ratios, final_z_scores[0], label='label1')
    second = plt.plot(ratios, final_z_scores[1], label='label2')
    
    plt.xlabel('Ratio Types')
    plt.ylabel('Values')
    plt.title('Final Comparisons of Stock Ratios')
    plt.legend(loc='upper left')
    
    # Calling plt.plot() here is unnecessary 
    plt.show()
    
        2
  •  0
  •   Philip Ciunkiewicz venkat    4 年前

    您可以更改在中分配标签的方式 plt.plot() 电话:

    first = plt.plot(ratios, final_z_scores[0], label='label1')
    second = plt.plot(ratios, final_z_scores[1], label='label2')
    

    然后,您可以将图例调用修改为: plt.legend() .

        3
  •  0
  •   William Miller devops-admin    4 年前

    考虑到图例属性将列表作为其参数。 试试这样的:

    plt.legend(['first stock name', 'second stock name'])
    
        4
  •  0
  •   denis_smyslov    4 年前

    看起来您将面向对象(OO)风格的绘图与PyPlot风格混合在一起。 如果你使用OO风格,你可以从定义ax开始:

    fig, ax = plt.subplots()
    

    而对于PyPlot样式,您可以直接使用plt.plot(),而无需先定义ax

    在您的代码中,您没有定义ax,而是使用了PyPlot样式:

    first = plt.plot(ratios, final_z_scores[0])
    second = plt.plot(ratios, final_z_scores[1])
    

    要解决您的问题,请继续使用PyPlot样式:

    first = plt.plot(ratios, final_z_scores[0], label='label1')
    second = plt.plot(ratios, final_z_scores[1], label='label2')
    ...
    plt.legend()
    plt.plot()
    

    请勿使用 ax.legend((first, second), ('label1', 'label2')) 这是一个你一开始没有定义的对象

    这里很好地解释了OO和PyPlot风格之间的区别: https://matplotlib.org/3.2.0/tutorials/introductory/usage.html#sphx-glr-tutorials-introductory-usage-py

        5
  •  0
  •   Flair    3 年前

    更换 dataframe.columns.tolist() 列出你的专栏。希望它能有所帮助:

    ax.legend(dataframe.columns.tolist())
    
    
    def plot_df(dataframe,x_label:str,y_label:str, title:str="" ):
        """
        requires plt.show() to display graph
        """
    
        
        
        fig,ax = plt.subplots(figsize=(15, 10))
       
        ax.set_xlabel(x_label)
        ax.set_ylabel(y_label)
        if title:
            ax.set_title(title)
    
        hourlocator = md.HourLocator(interval = 1)
    
        # Set the format of the major x-ticks:
        majorFmt = md.DateFormatter('%H:%M')  
    
        ax.xaxis.set_major_locator(hourlocator)
        ax.xaxis.set_major_formatter(majorFmt)
        ax.plot(dataframe.index,dataframe.values)
        ax.legend(dataframe.columns.tolist())
        fig.autofmt_xdate() #makes 30deg tilt on tick labels