Python 在一个情节的大量单独部分上色。我该怎么做?

Python 在一个情节的大量单独部分上色。我该怎么做?,python,matplotlib,Python,Matplotlib,我有一个250000条目的数组。我想把它画成一个直方图,这样我就可以根据它们的位置,最终给不同的元素涂上不同的颜色(我有一个列表可以比较,这样我就知道哪种颜色会出现在哪里)。但是,数组不是“标准”形式 每个索引对应于我希望它在图中的位置。我希望myarray[0]位于x轴的起始位置,myarray[1]位于下一个位置,以此类推,myarray的值沿y轴向上 简单地使用plot(myarray)本身就可以让人了解图形的形状,但是现在我想给元素单独上色,直线图似乎不是一个选项。我试着使用条形图,但无

我有一个250000条目的数组。我想把它画成一个直方图,这样我就可以根据它们的位置,最终给不同的元素涂上不同的颜色(我有一个列表可以比较,这样我就知道哪种颜色会出现在哪里)。但是,数组不是“标准”形式

每个索引对应于我希望它在图中的位置。我希望
myarray[0]
位于x轴的起始位置,
myarray[1]
位于下一个位置,以此类推,
myarray
的值沿y轴向上

简单地使用
plot(myarray)
本身就可以让人了解图形的形状,但是现在我想给元素单独上色,直线图似乎不是一个选项。我试着使用条形图,但无论出于什么原因,我的计算机都难以计算/渲染如此巨大的条形图

是否有任何方法可以合理地进行此操作,或者每次我尝试绘制此条形图时,我注定要让我的电脑被烧坏

最终目标是给不同的部分涂上不同的颜色。我认为最好的方法是使用条形图,但也可以使用plot(myarray),然后使用我要比较的列表对图形下的不同区域进行着色?阵列的每个元素都有一种快速变化的不同颜色。我不能简单地把前33%的颜色涂成一种颜色,第二33%涂成另一种颜色,最后34%涂成另一种颜色。这是非常“随机”的外观(虽然预先确定)我希望这些颜色去哪里

下面是我如何绘制我的250k条形图,其中
eloss
是我的250000个元素长的数组:

bins=_np.linspace(0,len(eloss), len(eloss)) 
_plt.bar(bins, eloss, width=0.1, color='blue')

这会很快冻结我的三台电脑。任何帮助都将不胜感激,解决方案似乎显而易见(绘制三个不同颜色的条形图,然后叠加),但使用了3台不同的计算机,每台计算机的规格都在不断增加,没有人能够处理。只要我能在片段中着色,我不在乎它是否是直方图/条形图/折线图。

我不完全确定是否理解您的问题,但如果我理解,可能会有一个解决方案:

import numpy as np
import matplotlib.pyplot as plt

#Fake data that should mimic yours
x = np.random.random(250000)
y = np.array(range(250000))

#create a list of color for each point
list_to_divide = range(10) # The list by wish you want your data divided
list_color = [plt.get_cmap('CMRmap')(i) for i in np.linspace(0, 0.9, len(list_to_divide))]
dict_color = dict(zip(list_to_divide, list_color))
c = map(int, x*10) #assign each of your point to a distinct category, here I divise my data by rank from 0 to 10
color = []
for i in c:
    color.append(list_color[i])
#color is now a list of the same dimension that your data and will be use to assign the color for each point

#Draw your plot
plt.scatter(x,y, s = 2, color = color, edgecolors = 'none')

在我的笔记本电脑上,它工作正常

在matplotlib中绘制大量条形图是一种效率非常低的方法

使用
fill\u-between
可以更容易地完成初始方法,这也会使绘制速度更快

举个简单的例子:

import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1982)

# Generate some interesting random data to plot...
num = 250000
data = np.random.normal(0, 1, num).cumsum()
data -= data.min()
x = np.arange(data.size)

fig, ax = plt.subplots()
path = ax.fill_between(x, data, facecolor='cadetblue', linewidth=0.1)
plt.show()

如果您想给这些图像上色,最简单的方法是绘制一幅图像,然后根据数据的范围对其进行剪裁。同样,这比250k独立条绘制速度快得多:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.path import Path
from matplotlib.patches import PathPatch
np.random.seed(1982)

# Generate some interesting random data to plot...
num = 250000
data = np.random.normal(0, 1, num).cumsum()
data -= data.min()
x = np.arange(data.size)

fig, ax = plt.subplots()
im = ax.imshow(data[None,:], extent=[x.min(), x.max(), data.min(), data.max()],
               aspect='auto', cmap='gnuplot')

xy = np.column_stack([x, data])
xy = np.vstack([[0, 0], xy, [x[-1], 0], [0, 0]])
path = ax.add_patch(PathPatch(Path(xy), facecolor='none', linewidth=0.1))
im.set_clip_path(path)

plt.show()