I am interested in plotting a legend in my scatterplot. My current code looks like this
x=[1,2,3,4]
y=[5,6,7,8]
classes = [2,4,4,2]
plt.scatter(x, y, c=classes, label=classes)
plt.legend()
The problem is that when the plot is created, the legend is shown as an array instead of showing the unique labels and their classes.
I am aware this is a question discussed previously in threads such as this one, however I feel that my problem is even simpler and the solution there does not fits it. Also, in that example the person is specifying the colors however in my case I do know beforehand how many colors I'll need. Moreover, in this example the user is creating multiple scatters, each one with a unique color. Again, this is not what I want. My goal is to simply create the plot using an x,y array and the labels. Is this possible?
Thanks.
Plot scatter graph: By using the scatter () method we can draw a plot. Add Legend: By using the legend () method we can add a legend to a plot. Generate a Plot: Use the show () method to visualize the plot on the user’s windows. We can add a legend to the plot using the matplotlib module.
Scatter plots with a legend ¶ To create a scatter plot with a legend one may use a loop and create one scatter plot per item to appear in the legend and set the label accordingly. The following also demonstrates how transparency of the markers can be adjusted by giving alpha a value between 0 and 1.
To plot 3D scatter plots in Python with hue colormap and legend, we can take the following steps− Create x, y and z data points using numpy. Create a new figure or activate an existing figure using figure () method.
Scatter Plot is a graph in which the values of two variables are plotted along two axes. It represent the reletionship between two variables in a data-set. Defining Libraries: Import the important libraries which are required for data creation and manipulation ( Numpy and Pandas) and for data visualization ( pyplot from matplotlib).
Actually both linked questions provide a way how to achieve the desired result.
The easiest method is to create as many scatter plots as unique classes exist and give each a single color and legend entry.
import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
classes = [2,4,4,2]
unique = list(set(classes))
colors = [plt.cm.jet(float(i)/max(unique)) for i in unique]
for i, u in enumerate(unique):
xi = [x[j] for j in range(len(x)) if classes[j] == u]
yi = [y[j] for j in range(len(x)) if classes[j] == u]
plt.scatter(xi, yi, c=colors[i], label=str(u))
plt.legend()
plt.show()
In case the classes are string labels, the solution would look slightly different, in that you need to get the colors from their index instead of using the classes themselves.
import numpy as np
import matplotlib.pyplot as plt
x=[1,2,3,4]
y=[5,6,7,8]
classes = ['X','Y','Z','X']
unique = np.unique(classes)
colors = [plt.cm.jet(i/float(len(unique)-1)) for i in range(len(unique))]
for i, u in enumerate(unique):
xi = [x[j] for j in range(len(x)) if classes[j] == u]
yi = [y[j] for j in range(len(x)) if classes[j] == u]
plt.scatter(xi, yi, c=colors[i], label=str(u))
plt.legend()
plt.show()
Maybe manually filling a table
could be useful here. Another idea is using colorbar
if your classes are contiguous numbers. I'm showing both approaches in one.
import matplotlib.pyplot as plt
import numpy as np
x=[1,2,3,4,5,6,7]
y=[1,2,3,4,5,6,7]
classes = [2,4,4,2,1,3,5]
cmap = plt.cm.get_cmap("viridis",5)
plt.scatter(x, y, c=classes, label=classes,cmap=cmap,vmin=0.5,vmax=5.5)
plt.colorbar()
unique_classes = list(set(classes))
plt.table(cellText=[[x] for x in unique_classes], loc='lower right',
colWidths=[0.2],rowColours=cmap(np.array(unique_classes)-1),
rowLabels=['label%d'%x for x in unique_classes],
colLabels=['classes'])
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With