46

I'm using python to simulate some automation models, and with the help of matplotlib I'm producing plots like the one shown below.

enter image description here

I'm currently plotting with the following command:

ax.imshow(self.g, cmap=map, interpolation='nearest')

where self.g is the binary map (0 -> blue, 1 -> red in my current plots).

However, to include this in my report I would like the plot to be with black dots on white background instead of red on blue. How do I accomplish that?

Tomas Aschan
  • 58,548
  • 56
  • 243
  • 402

2 Answers2

69

You can change the color map you are using via the cmap keyword. The color map 'Greys' provides the effect you want. You can find a list of available maps on the scipy website.

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(101)
g = np.floor(np.random.random((100, 100)) + .5)

plt.subplot(211)
plt.imshow(g)
plt.subplot(212)
plt.imshow(g, cmap='Greys',  interpolation='nearest')
plt.savefig('blkwht.png')

plt.show()

which results in:

enter image description here

bossylobster
  • 9,993
  • 1
  • 42
  • 61
Yann
  • 33,811
  • 9
  • 79
  • 70
  • 1
    You can just give the name of the colormap to `cmap`. `plt.imshow(g, cmap="Greys")` would do the same thing. – Avaris Mar 09 '12 at 20:09
  • you may also use plt.gray() at the beginning to get similar results. – touchStone Dec 06 '15 at 19:16
  • 1
    In my version of matplotlib (1.5.2rc2) I had to use cmap='gray' . Guess they changed the names a bit. If you do it wrong though, it prints out all the options, which is nice. – Nick Crews Jun 06 '17 at 17:12
18

There is an alternative method to Yann's answer that gives you finer control. Matplotlib's imshow can take a MxNx3 matrix where each entry is the RGB color value - just set them to white [1,1,1] or black [0,0,0] accordingly. If you want three colors it's easy to expand this method.

import matplotlib.pyplot as plt
import numpy as np

# Z is your data set
N = 100
Z = np.random.random((N,N))

# G is a NxNx3 matrix
G = np.zeros((N,N,3))

# Where we set the RGB for each pixel
G[Z>0.5] = [1,1,1]
G[Z<0.5] = [0,0,0]

plt.imshow(G,interpolation='nearest')
plt.show()

enter image description here

Hooked
  • 84,485
  • 43
  • 192
  • 261