【问题标题】:Personalised colourmap plot using set numbers using matplotlib使用 matplotlib 使用设定数字的个性化颜色图图
【发布时间】:2017-04-14 23:18:14
【问题描述】:

我有一个看起来像(示例)的数据

x y  d
0 0 -2
1 0  0
0 1  1 
1 1  3

我想把它变成一个coloumap图,看起来像其中之一:

其中 x 和 y 在表格中,颜色由 'd' 给出。但是,我希望每个数字都有一个预先确定的颜色,例如:

-2 - orange
 0 - blue
 1 - red
 3 - yellow

不一定是这些颜色,但我需要将数字寻址到颜色并且数字不是按顺序或顺序排列的,它们只是一组五个或六个随机数字,它们在整个数组中重复。

任何想法,我没有代码,因为我不知道从哪里开始。但是,我已经查看了此处的示例,例如:

Matplotlib python change single color in colormap

但是,它们只展示了如何定义颜色,而不是如何将这些颜色链接到特定值。

【问题讨论】:

标签: python matplotlib colors colormap color-mapping


【解决方案1】:

事实证明这比我想象的要难,所以也许有人有更简单的方法。

由于我们需要创建数据的图像,我们将它们存储在一个二维数组中。然后我们可以将数据映射到整数0 .. number of different data values 并为每个整数分配颜色。原因是我们希望最终的颜色图是等间距的。所以

-2 --> 整数0 --> 颜色orange
0 --> 整数1 --> 颜色blue 等等。

有了间隔很好的整数,我们可以在新创建的整数值的图像上使用ListedColormap

import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors

# define the image as a 2D array
d = np.array([[-2,0],[1,3]])

# create a sorted list of all unique values from d
ticks = np.unique(d.flatten()).tolist()
# create a new array of same shape as d
# we will later use this to store values from 0 to number of unique values
dc = np.zeros(d.shape)
#fill the array dc
for i in range(d.shape[0]):
    for j in range(d.shape[1]):
        dc[i,j] = ticks.index(d[i,j])

# now we need n (= number of unique values) different colors        
colors= ["orange", "blue", "red", "yellow"]
# and put them to a listed colormap
colormap =  matplotlib.colors.ListedColormap(colors)


plt.figure(figsize=(5,3))
#plot the newly created array, shift the colorlimits, 
# such that later the ticks are in the middle
im = plt.imshow(dc, cmap=colormap, interpolation="none", vmin=-0.5, vmax=len(colors)-0.5)
# create a colorbar with n different ticks
cbar = plt.colorbar(im, ticks=range(len(colors)) )
#set the ticklabels to the unique values from d
cbar.ax.set_yticklabels(ticks)
#set nice tickmarks on image
plt.gca().set_xticks(range(d.shape[1]))
plt.gca().set_yticks(range(d.shape[0]))

plt.show()


由于可能无法直观地清楚如何将数组d 获取为使用imshow 绘图所需的形状,即作为二维数组,这里有两种转换输入数据列的方法:

import numpy as np

x = np.array([0,1,0,1])
y  = np.array([ 0,0,1,1])
d_original = np.array([-2,0,1,3])

#### Method 1 ####
# Intuitive method. 
# Assumption: 
#    * Indexing in x and y start at 0 
#    * every index pair occurs exactly once.
# Create an empty array of shape (n+1,m+1) 
#   where n is the maximum index in y and
#         m is the maximum index in x
d = np.zeros((y.max()+1 , x.max()+1), dtype=np.int) 
for k in range(len(d_original)) :
    d[y[k],x[k]] = d_original[k]  
print d

#### Method 2 ####
# Fast method
# Additional assumption: 
#  indizes in x and y are ordered exactly such
#  that y is sorted ascendingly first, 
#  and for each index in y, x is sorted. 
# In this case the original d array can bes simply reshaped
d2 = d_original.reshape((y.max()+1 , x.max()+1))
print d2

【讨论】:

  • 嘿伙计,这听起来和我想做的完全一样。不过只有一个问题。我的数据是一长串数字(比如一百个)我有你似乎没有使用的 x 和 y 位置。但是我如何在二维数组中使用一长串值,这将是你的 d?
  • 我假设我需要创建一个数组,假设我的数据给出了一个 10x10 的颜色图,我需要一个 10x10 的数组,这样准确吗?
  • 我编辑了答案以包括如何从您拥有的列结构中制作所需的数组。确实,要绘制 10x10 图形,您需要一个 10x10 数组。索引是隐式完成的,该数组的第一列,第一行是索引 0,0。最后一列,最后一行的索引为 9,9。
  • 完全做到了,伙计!愚蠢的问题,有没有一种简单的方法可以改变每个正方形的大小?现在它唯一的统一,但是如果我希望每个正方形都是 3x3?
  • 方块没有大小。你的意思是改变标签?尝试添加plt.gca().set_xticklabels(np.array(range(d.shape[1]))*3 )
猜你喜欢
  • 2016-02-25
  • 1970-01-01
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 2013-02-14
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多