Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将图例添加到颜色为动态的matplotlib散点图中_Python_Python 3.x_Matplotlib - Fatal编程技术网

Python 将图例添加到颜色为动态的matplotlib散点图中

Python 将图例添加到颜色为动态的matplotlib散点图中,python,python-3.x,matplotlib,Python,Python 3.x,Matplotlib,我用Matplolib和Pandas数据框创建了散点图,现在我想给它添加一个图例。这是我的密码: colors = ['red' if x >= 150 and x < 200 else 'green' if x >= 200 and x < 400 else 'purple' if x >= 400 and x < 600 else 'yellow' if x >= 600 else 'te

我用Matplolib和Pandas数据框创建了散点图,现在我想给它添加一个图例。这是我的密码:

colors = ['red' if x >= 150 and x < 200 else 
          'green' if x >= 200 and x < 400 else
          'purple' if x >= 400 and x < 600 else
          'yellow' if x >= 600 else 'teal' for x in myData.R]


ax1.scatter(myData.X, myData.Y, s=20, c=colors, marker='_', label='Test')
ax1.legend(loc='upper left', frameon=False)
我试过了,但我不明白的是:

  • 如何动态设置图例的标签?例如,如果x>=150,我的代码会显示“红色”,因此在图例上应该有一个红色正方形,旁边有>150。但是,由于我没有手动添加任何标签,因此我很难理解这一点

  • 尝试以下操作后,我只得到一个带有单个标签“Classes”的图例:

  • `legend1=ax1.legend(*scatter.legend_elements(), loc=“左下”,title=“类”)

    ax1.添加艺术家(legend1)`


    感谢您的任何建议

    可以加速的代码的一部分是使用普通Python循环创建字符串列表。 熊猫非常有效地使用numpy的过滤。 绘制散点图主要取决于点的数量,当一次绘制所有点或将所有点分为五部分单独绘制时,点的数量不会改变

    一些使用matplotlib在循环中分散的示例代码:

    从matplotlib导入pyplot作为plt
    将numpy作为np导入
    作为pd进口熊猫
    N=500
    myData=pd.DataFrame({'X':np.round(np.random.uniform(-10001000,N),-2),
    'Y':np.随机.均匀(-800800,N)})
    myData['R']=np.sqrt(myData.X**2+myData.Y**2)
    图,ax1=plt.子批次()
    边界=[150200400600]
    颜色=['teal'、'red'、'green'、'purple'、'gold']
    对于b0、b1、zip中的列([None]+边界,边界+[None],颜色):
    如果b0为无:
    过滤器=(myData.R=b0)
    label=f'${b0}≤ R$'
    其他:
    过滤器=(myData.R>=b0)和(myData.R

    或者,熊猫的
    cut
    可用于创建类别,seaborn的特征(如其
    hue
    参数)可进行着色并自动创建图例

    从matplotlib导入pyplot作为plt
    将numpy作为np导入
    作为pd进口熊猫
    导入seaborn作为sns
    N=500
    myData=pd.DataFrame({'X':np.round(np.random.uniform(-10001000,N),-2),'Y':np.random.uniform(-800800,N)})
    myData['R']=np.sqrt(myData.X**2+myData.Y**2)
    图,ax1=plt.子批次()
    边界=[150200400600]
    颜色=['teal'、'red'、'green'、'purple'、'gold']
    hues=pd.cut(myData.R[0]+bounds+[2000],right=False)
    sns.scatterplot(myData.X,myData.Y,色调=色调,色调顺序=色调.cat.categories,调色板=颜色,s=20,标记=“”,ax=ax1)
    plt.show()
    

    不确定,但它在中指出散点图应具有
    cmap
    vmin
    vmax
    参数。他们没有解决你的问题吗?不是传说,您可以有一个自定义的颜色栏。另一个想法是根据
    myData.R
    myData.X
    myData.Y
    预先分割到特定的彩色数据集中,并将每个子集作为额外的散点图添加到具有固定颜色和标签的图形中。@RolandDeschain因此,我们的想法是为所有人制作散点图红色元素,绿色元素,等等?但是,生成不是需要更多的时间吗?取决于您有多少数据点。绘图本身不应该成为问题,划分到子集可能需要最长的时间,但如果可以使用numpy以某种矢量化方式进行,则可能会很快。这是为了某种动画吗?显示了我在颜色栏中的意思(在答案中)。您可以创建自定义范围并绘制完整的数据集,然后根据您在颜色栏中的设置以颜色进行绘制。散点图也支持这些。很好!这两种方法都非常有效,我想我会选择第一种,因为我想坚持使用MPL,而不添加新的依赖项,如Seaborn。多谢各位!我还找到了另一个解决方案,但它是“黑客式的”:,基本上它可以独立地从情节中创建图例,当然,按照您的建议做会更好,因为图例是直接从数据生成的
           X  Y    R
    0      1  945  1236.334519
    0      1  950   212.809352
    0      1  950   290.663847
    0      1  961   158.156856