【问题标题】:How to scatter plot each group of a pandas DataFrame如何散点图每组熊猫数据框
【发布时间】:2021-12-28 02:51:39
【问题描述】:

我正在使用 seaborn 的间歇泉数据集制作散点图。我正在根据“种类”列为点着色,但由于某种原因,图例仅显示“长”,而忽略了“短”。我不知道我错过了什么。我还想知道是否有一种更简单的方法来对不使用 for 循环的数据进行颜色编码。谢谢!

x = geyser_df['waiting']
y = geyser_df['duration']
col = []

for i in range(len(geyser_df)):
    if (geyser_df['kind'][i] == 'short'):
        col.append('MediumVioletRed')
    elif(geyser_df['kind'][i] == 'long'):
        col.append('Navy')

plt.scatter(x, y, c=col)
plt.legend(('long','short'))
plt.xlabel('Waiting')
plt.ylabel("Duration")
plt.suptitle("Waiting vs Duration")
plt.show()

【问题讨论】:

    标签: python pandas matplotlib data-visualization scatter-plot


    【解决方案1】:
    import pandas as pd
    import seaborn as sns
    import matplotlib.pyplot as plt
    
    # load data
    df = sns.load_dataset('geyser')
    
    # plot
    fig, ax = plt.subplots(figsize=(6, 4))
    colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
    for kind, data in df.groupby('kind'):
        data.plot(kind='scatter', x='waiting', y='duration', label=kind, color=colors[kind], ax=ax)
    
    ax.set(xlabel='Waiting', ylabel='Duration')
    fig.suptitle('Waiting vs Duration')
    plt.show()
    

    • 最简单的方法是使用 seaborn,这是 matplotlib 的高级 API,其中 hue 用于按颜色分隔组。
    fig, ax = plt.subplots(figsize=(6, 4))
    colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
    sns.scatterplot(data=df, x='waiting', y='duration', hue='kind', palette=colors, ax=ax)
    
    ax.set(xlabel='Waiting', ylabel='Duration')
    fig.suptitle('Waiting vs Duration')
    plt.show()
    
    colors = {'short': 'MediumVioletRed', 'long': 'Navy'}
    p = sns.relplot(data=df, x='waiting', y='duration', hue='kind', palette=colors, height=4, aspect=1.5)
    
    ax = p.axes.flat[0]  # extract the single subplot axes
    
    ax.set(xlabel='Waiting', ylabel='Duration')
    p.fig.suptitle('Waiting vs Duration', y=1.1)
    plt.show()
    

    【讨论】:

      【解决方案2】:

       您将x = geyser_df ['waiting']y = geyser_df ['duration'] 作为单个数据集传递,这导致plt.scatter 仅用作label="long" 作为图例。我没有足够的经验使用这种类型的,但是要重现您描述的示例,您需要编写这样的程序:


      long = [[], []]
      short = [[], []]
      col=['MediumVioletRed', 'Navy']
      
      for i in range(len(geyser_df["kind"])):
        if (geyser_df["kind"][i] == "long"):
            long[0].append([geyser_df['waiting'][i]])
            long[1].append([geyser_df['duration'][i]])
        else:
            short[0].append([geyser_df['waiting'][i]])
            short[1].append([geyser_df['duration'][i]])
      
      plt.scatter(long[0], long[1], c=col[1], label="long")
      plt.scatter(short[0], short[1], c=col[0], label="short")
      
      plt.legend()
      plt.xlabel('Waiting')
      plt.ylabel("Duration")
      plt.suptitle("Waiting vs Duration")
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 2017-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        相关资源
        最近更新 更多