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

Posted

技术标签:

【中文标题】尝试创建一个散点图,其中循环标记和颜色,以便在标记的 1 个循环完成后更改颜色【英文标题】:Trying to create a scatter plot where the marker and color is cycled such that colour is changed after the 1 cycle of marker is complete 【发布时间】:2020-11-08 12:43:12 【问题描述】:

我正在尝试制作散点图,该图显示数据框中每个索引条目(公司)的不同标记以及不同的颜色,因为图中的条目太多,要么太近,要么太多而无法正确区分(每个循环的颜色和标记循环,因此颜色和符号自 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()

谢谢

【问题讨论】:

【参考方案1】:

你可以循环遍历颜色和标记 使用// 作为颜色,使用% 作为标记,为所有标记保留一种颜色,而不是为所有标记使用第二种颜色,依此类推:

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

一个简单的例子:

import matplotlib.pyplot as plt
marker_list = ['v', '^', '<', '>']
color_list = ['r', 'b', 'g', 'y', 'm']

x = np.random.random((len(marker_list) * len(color_list), 2))

plt.figure()
for i, xx in enumerate(x):
    plt.plot(*xx, color=color_list[i // len(marker_list)], ls='',
             marker=marker_list[i % len(marker_list)], label=str(i))

plt.legend(ncol=2)

【讨论】:

以上是关于尝试创建一个散点图,其中循环标记和颜色,以便在标记的 1 个循环完成后更改颜色的主要内容,如果未能解决你的问题,请参考以下文章

具有不同颜色编码和不同标记的 Sns 散点图

使用 OpenGL 的散点图:如何设置标记样式

如何使用熊猫数据框中的列标记气泡图/散点图?

散点图通过颜色matplotlib python分离集群

使用补丁自定义散点图中的图例标记面颜色

如何用matlab 画散点图 如何标记数据点的颜色