在绘图的大量单个部分着色。我怎样才能做到这一点?

时间:2015-02-28 22:13:21

标签: python matplotlib

我有一个包含250,000个条目的数组。我想把它绘制成直方图,这样我最终可以根据它们的位置为不同颜色的不同颜色元素着色(我有一个要比较的列表,以便我知道哪种颜色在哪里)。但是,阵列不符合标准"形式。

每个索引对应于图中我想要的位置。我希望myarray[0]位于x轴的起点,myarray[1]为下一个,依此类推,myarray的值沿y轴向上移动。

简单地使用plot(myarray)本身就可以了解图形的形状,但现在我想单独对颜色元素进行着色,线图似乎不是一个选项。我尝试使用条形图,但无论出于何种原因,我的计算机都在努力计算/渲染如此巨大的条形图。

有没有办法以合理的方式做到这一点,或者每次我尝试绘制这个条形图时,我注定要将我的电脑打砖块?

最终目标是为不同的部分着色不同的颜色。我认为最好的方法是使用条形图,但也可以使用绘图(myarray),然后使用我打算比较的列表在图表下面的不同区域。阵列的每个元素都有不同的颜色,可以快速变化。我不能简单地在前33%的一种颜色,第二种33%的另一种颜色,然后最后的34%在另一种颜色。它非常"随机"在外观上(虽然是预定的)我想要这些颜色。

以下是我尝试绘制250k条形图的方法,其中eloss是我的250,000个元素长数组:

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

这很快冻结了我的三台电脑。任何帮助都会非常感激,解决方案似乎很明显(绘制三个条形图,每个条形图都有不同的颜色,然后覆盖它们),但是使用了3台不同的计算机,每个计算机都在增加规格,没有一个可以处理它。只要我能在片段中着色,我就不在乎它是否是直方图/条形图/折线图。

2 个答案:

答案 0 :(得分:0)

'我不完全确定你的问题,但如果我这样做,可能会有一个解决方案:

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')

在我的笔记本电脑上,它运行正常。

答案 1 :(得分:0)

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

使用fill_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()

enter image description here

如果您想要对这些颜色进行着色,最简单的方法是绘制图像,然后根据数据的范围进行剪裁。再次,这比更多绘制得比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()

enter image description here