Python 尝试创建散点图,其中标记和颜色循环,以便在标记的1个循环完成后更改颜色

Python 尝试创建散点图,其中标记和颜色循环,以便在标记的1个循环完成后更改颜色,python,pandas,matplotlib,jupyter-notebook,itertools,Python,Pandas,Matplotlib,Jupyter Notebook,Itertools,我试图做一个散点图。该图显示了数据框中每个索引项(公司)的不同标记以及不同的颜色,因为图中有太多的条目,要么太近,要么太多,无法正确区分(颜色和标记在每个循环中循环,因此颜色和符号从PSPPROJECT开始重复)(图中的示例:GODREJPROP和IL&FSENGG具有相同的标记和颜色) 简单地说,我希望标记在1个周期内以颜色显示,然后在标记的每个周期内以不同的颜色显示,从而确保易于识别绘图中的点。请建议此问题的任何修复或替代方案,或改进此代码的任何方法 我还想借此机会征求意见,保持我的图例条目

我试图做一个散点图。该图显示了数据框中每个索引项(公司)的不同标记以及不同的颜色,因为图中有太多的条目,要么太近,要么太多,无法正确区分(颜色和标记在每个循环中循环,因此颜色和符号从PSPPROJECT开始重复)(图中的示例:GODREJPROP和IL&FSENGG具有相同的标记和颜色)

简单地说,我希望标记在1个周期内以颜色显示,然后在标记的每个周期内以不同的颜色显示,从而确保易于识别绘图中的点。请建议此问题的任何修复或替代方案,或改进此代码的任何方法

我还想借此机会征求意见,保持我的图例条目在足够的列中形成自己的形状,以确保它不会太长

我在这里上传了一个绘图图像:

到目前为止,我已经提出了以下代码,代码中的“I”是一个数据帧,“j”是一个字符串,“EQW”是包含两种类型的多个元素的元组列表

for i,j in EQW:
    k = i.agg(["mean", "std"]).T
    k.columns = ["Return", "Risk"]
    plt.figure(figsize = (12,8))
    mark=itertools.cycle(("o","v","^","<",">","1","2","3","4","8","s","p","P","*","h","H","+","x","X","d"))
    for l in k.index:
        plt.scatter(x = k.loc[l,"Risk"], y = k.loc[l,"Return"], s = 75,label=l,marker =next(mark))
    if len(k.index)<20:
        plt.legend(bbox_to_anchor=(1.0,1.0))
    elif len(k.index)>30 and len(k.index)<50:
        plt.legend(bbox_to_anchor=(1.0,1.0),ncol=2)
    else:
        plt.legend(bbox_to_anchor=(1.0,1.0),ncol=3)
    plt.xlabel("Risk(std)", fontsize = 15)
    plt.ylabel("Return", fontsize = 15)
    plt.title("Risk/Return for {} with Equally Weighted Portfolio".format(j), fontsize = 20)
    plt.show()
等式中i,j的
:
k=i.agg([“平均值”,“标准值]).T
k、 列=[“返回”、“风险”]
plt.图(figsize=(12,8))
mark=itertools.循环((“o”,“v”,“^”,“1”,“2”,“3”,“4”,“8”,“s”,“p”,“p”,“*”,“h”,“h”,“+”,“x”,“x”,“d”))
对于k中的l,索引:
plt.散布(x=k.loc[l,“风险”]、y=k.loc[l,“返回”]、s=75、label=l、marker=next(标记))

如果len(k.index)30和len(k.index)可以循环使用颜色和标记以及 使用
/
作为颜色,使用
%
作为标记,为所有标记保留一种颜色,然后为所有标记使用第二种颜色,依此类推:

len_markers = 3
len_colors = 2
for i in range(len_markers*len_colors):
    print(i, i // len_markers, i % len_markers)

# 0 0 0
# 1 0 1
# 2 0 2
# 3 1 0
# 4 1 1
# 5 1 2
一个简单的例子:

导入matplotlib.pyplot作为plt
标记列表=['v','^','']
颜色列表=['r','b','g','y','m']
x=np.random.random((len(标记列表)*len(颜色列表),2))
plt.图()
对于i,枚举(x)中的xx:
plt.plot(*xx,color=color\u list[i//len(marker\u list)],ls=“”,
marker=marker\u list[i%len(marker\u list)],label=str(i))
plt.图例(ncol=2)