【问题标题】:Using lists to assign colors to a series in matplotlib?使用列表为 matplotlib 中的系列分配颜色?
【发布时间】:2015-10-01 05:01:19
【问题描述】:

我认为使用 N 个不同系列(如在 excel 中)制作散点图的最简单方法是拥有 3 个列表:i) x_coordinates 将有 N 个包含 X 位置的列表; 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

【问题讨论】:

    标签: python matplotlib graph plot colors


    【解决方案1】:

    我认为基本问题是你必须重新考虑是否真的需要scatter 函数。根据您发布的内容,我认为重复使用 plot 就足够了。 scatter 产生一系列彩色标记(可以为标记分配不同的颜色和大小),而 plot 只绘制单一颜色的线条。但是,这些线也可以在点上有标记(使用单一颜色)。所以解决这个问题的方法是为每个系列创建一个线图。 (如果您不想要这条线,您可以将linestyle 设置为'none'。但是your previous question 我相信您无论如何都想这样做)

    注意:我还在您的代码中应用了一些修饰:1) 无需为颜色创建十六进制字符串。只需使用从 0 到 1 缩放的 3 个元素的列表/元组。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()
    

    结果:

    【讨论】:

      【解决方案2】:

      颜色是按点指定的,而不是按系列指定的。您看到的着色是它使用第一个颜色作为第一个系列的第一个点,然后使用下一个颜色作为该系列的下一个点,然后循环回到第一个颜色作为第一个系列的第三个点,依此类推开。

      我不知道有任何方法可以使用您显示的格式的数据指定每个系列的颜色。你必须用你想要的所有颜色制作一个序列,例如:

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

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

      【讨论】:

        猜你喜欢
        • 2018-08-29
        • 2022-01-08
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 2017-05-18
        • 2018-08-07
        • 1970-01-01
        • 2018-12-21
        相关资源
        最近更新 更多