繁体   English   中英

使用列表为matplotlib中的系列指定颜色?

[英]Using lists to assign colors to a series in matplotlib?

我认为制作具有N个不同系列的散点图的最简单方法(如在excel中)将具有3个列表:i)x_coordinates将具有包含X位置的N个列表; ii)y_coordinates还有N个包含Y位置的列表; iii)color_map将包含N个元素,每个元素包含不同的RGB颜色。

我的问题是,在绘制标记的颜色时,顺序变得奇怪。 为什么会发生这种情况,我该如何解决?

import matplotlib.pyplot as plt
import random
x_coordinates = [(range(1,4))]*2
y_coordinates = [[3,4,5],[2,2,2]]
color_map = []
for i in range(0,len(x_coordinates)):
    r = lambda: random.randint(0,255)
    rgb_hex = ('#%02X%02X%02X' % (r(),r(),r()))
    color_map.append(rgb_hex)
plt.scatter(x_coordinates,y_coordinates,c=color_map)
plt.show()

列出x / y坐标和颜色

[[1, 2, 3], [1, 2, 3]] #x
[[3, 4, 5], [2, 2, 2]] #y
['#E6764F', '#A12678'] #colors

在此输入图像描述

每个点指定颜色,而不是每个系列。 您看到的颜色是它使用第一个颜色作为第一个系列的第一个点,然后是该系列的下一个点的下一个颜色,然后循环回到第一个系列的第三个点的第一个颜色,所以上。

我不知道以任何方式使用您显示的格式指定每个系列的颜色。 您需要使用所需的所有颜色制作单个序列,例如:

# make first series red and second series blue
color_map = ["#FF0000"]*3 + ["#0000FF"]*3

或者,您可以转置您的x和y数据,以便系列是列而不是行(我认为matplotlib无论如何都会解释它们)。 然后指定两种颜色将做你想要的。

我认为基本问题是如果你真的需要scatter功能,你必须重新考虑。 从您发布的内容来看,我认为重复使用plot就足够了。 scatter产生一系列彩色标记(可以为标记指定不同的颜色和大小),而plot只是用单一颜色绘制线条。 但是,这些线条也可以在点处具有标记(使用单一颜色)。 因此,解决这个问题的方法是为每个系列创建一个线图。 (如果你不想要这一行,你可以将linestyle设置为'none' 。但是,相信你以前的问题,我相信你想要做到这一点)

注意:我还在代码中应用了一些化妆品:1)不需要为颜色创建十六进制字符串。 只需使用列表/元组,其中3个元素从0到1缩放.2)您可以简单地将随机函数保存到r。 无需创建lambda函数。

import matplotlib.pyplot as plt
import random

# x and y coordinates
x_coordinates = [range(1,4)]*2
y_coordinates = [[3,4,5],[2,2,2]]

# colors (one per series --> 2 in this example)
colors = []
r = random.random
for i in range(0,len(x_coordinates)):
    rgb =  (r(),r(),r())
    colors.append(rgb)

# iterate over the series
for x, y, c in zip(x_coordinates, y_coordinates, colors):
    plt.plot(x, y, color=c, linestyle='-', marker='o', markeredgecolor='k',
            markersize=10)

# show the figure
plt.margins(x=0.1, y=0.1)
plt.show()

结果: 在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM