簡體   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