Changing marker style in scatter plot according to third variable

前端 未结 3 1346
借酒劲吻你
借酒劲吻你 2020-12-18 22:49

I am dealing with a multi-column dictionary. I want to plot two columns and subsequently change color and style of the markers according to a third and fourth column.

<
相关标签:
3条回答
  • 2020-12-18 23:10

    Easiest solution for me was to use pandas and seaborn:

    import pandas as pd   # '0.25.3'
    import seaborn as sns # '0.9.0'
    
    data = pd.DataFrame(
        dict(x=[1,2,3,4,5,6],
        y=[1,3,4,5,6,7],
        m=['k','l','l','k','j','l'],)
    )
    
    sns.scatterplot(data=data, x='x', y='y', style='m')
    

    seaborn automatically chooses the marker style for you.

    0 讨论(0)
  • 2020-12-18 23:22

    Adding to the answer of Viktor Kerkez and using a bit of Numpy you can do something like the following:

    x = np.array([1,2,3,4,5,6])
    y = np.array([1,3,4,5,6,7])
    m = np.array(['o','+','+','o','x','+'])
    
    unique_markers = set(m)  # or yo can use: np.unique(m)
    
    for um in unique_markers:
        mask = m == um 
        # mask is now an array of booleans that can be used for indexing  
        plt.scatter(x[mask], y[mask], marker=um)
    
    0 讨论(0)
  • 2020-12-18 23:23

    The problem is that marker can only be a single value and not a list of markers, as the color parmeter.

    You can either do a grouping by marker value so you have the x and y lists that have the same marker and plot them:

    xs = [[1, 2, 3], [4, 5, 6]]
    ys = [[1, 2, 3], [4, 5, 6]]
    m = ['o', 'x']
    for i in range(len(xs)):
        plt.scatter(xs[i], ys[i], marker=m[i])
    plt.show()
    

    Or you can plot every single dot (which I would not recommend):

    x=[1,2,3,4,5,6]
    y=[1,3,4,5,6,7]
    m=['k','l','l','k','j','l']
    
    mapping = {'j' : 'o', 'k': 'x', 'l': '+'}
    
    for i in range(len(x)):
        plt.scatter(x[i], y[i], marker=mapping[m[i]])
    plt.show()
    
    0 讨论(0)
提交回复
热议问题