Scatter plots in Pandas/Pyplot: How to plot by category

前端 未结 8 1006
孤城傲影
孤城傲影 2020-11-22 10:53

I am trying to make a simple scatter plot in pyplot using a Pandas DataFrame object, but want an efficient way of plotting two variables but have the symbols dictated by a t

8条回答
  •  一个人的身影
    2020-11-22 11:18

    From matplotlib 3.1 onwards you can use .legend_elements(). An example is shown in Automated legend creation. The advantage is that a single scatter call can be used.

    In this case:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame(np.random.normal(10,1,30).reshape(10,3), 
                      index = pd.date_range('2010-01-01', freq = 'M', periods = 10), 
                      columns = ('one', 'two', 'three'))
    df['key1'] = (4,4,4,6,6,6,8,8,8,8)
    
    
    fig, ax = plt.subplots()
    sc = ax.scatter(df['one'], df['two'], marker = 'o', c = df['key1'], alpha = 0.8)
    ax.legend(*sc.legend_elements())
    plt.show()
    

    In case the keys were not directly given as numbers, it would look as

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame(np.random.normal(10,1,30).reshape(10,3), 
                      index = pd.date_range('2010-01-01', freq = 'M', periods = 10), 
                      columns = ('one', 'two', 'three'))
    df['key1'] = list("AAABBBCCCC")
    
    labels, index = np.unique(df["key1"], return_inverse=True)
    
    fig, ax = plt.subplots()
    sc = ax.scatter(df['one'], df['two'], marker = 'o', c = index, alpha = 0.8)
    ax.legend(sc.legend_elements()[0], labels)
    plt.show()
    

提交回复
热议问题