Gerges
Gerges

Reputation: 6499

Using a colormap for a pandas Series

I have pandas series of complex numbers, which I would like to plot. Currently, I am looping through each point and assigning it a color. I would prefer to generate the plot without the need to loop over each point... Using Series.plot() would be preferable. Converting series to numpy is ok though.

Here is an example of what I currently have:

import pandas as pd
import numpy as np
from matplotlib import pyplot

s = pd.Series((1+np.random.randn(500)*0.05)*np.exp(1j*np.linspace(-np.pi, np.pi, 500)))

cmap = pyplot.cm.viridis    
for i, val in enumerate(s):
    pyplot.plot(np.real(val), np.imag(val), 'o', ms=10, color=cmap(i/(len(s)-1)))
pyplot.show()

enter image description here

Upvotes: 1

Views: 2412

Answers (2)

ImportanceOfBeingErnest
ImportanceOfBeingErnest

Reputation: 339230

You can simply plot the real and imaginary part of the series without a loop.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

s = pd.Series((1+np.random.randn(500)*0.05)*np.exp(1j*np.linspace(-np.pi, np.pi, 500)))

plt.plot(s.values.real,s.values.imag, marker="o", ls="")

plt.show()

enter image description here

However, you need to use a scatter plot if you want to have different colors:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

s = pd.Series((1+np.random.randn(500)*0.05)*np.exp(1j*np.linspace(-np.pi, np.pi, 500)))

plt.scatter(s.values.real,s.values.imag, c = range(len(s)), cmap=plt.cm.viridis)

plt.show()

enter image description here

Upvotes: 2

MB-F
MB-F

Reputation: 23637

You can use pyplot.scatter, which allows coloring of points based on a value.

pyplot.scatter(np.real(s), np.imag(s), s=50, c=np.arange(len(s)), cmap='viridis')

Here, we set c to an increasing sequence to get the same result as in the question. enter image description here

Upvotes: 3

Related Questions