Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matplotlib scatter plot legend

I created a 4D scatter plot graph to represent different temperatures in a specific area. When I create the legend, the legend shows the correct symbol and color but adds a line through it. The code I'm using is:

colors=['b', 'c', 'y', 'm', 'r'] lo = plt.Line2D(range(10), range(10), marker='x', color=colors[0]) ll = plt.Line2D(range(10), range(10), marker='o', color=colors[0]) l = plt.Line2D(range(10), range(10), marker='o',color=colors[1]) a = plt.Line2D(range(10), range(10), marker='o',color=colors[2]) h = plt.Line2D(range(10), range(10), marker='o',color=colors[3]) hh = plt.Line2D(range(10), range(10), marker='o',color=colors[4]) ho = plt.Line2D(range(10), range(10), marker='x', color=colors[4]) plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),numpoints=1, loc='lower left', ncol=3, fontsize=8) 

I tried changing Line2D to Scatter and scatter. Scatter returned an error and scatter changed the graph and returned an error.

With scatter, I changed the range(10) to the lists containing the data points. Each list contains either the x, y, or z variable.

lo = plt.scatter(xLOutlier, yLOutlier, zLOutlier, marker='x', color=colors[0]) ll = plt.scatter(xLoLo, yLoLo, zLoLo, marker='o', color=colors[0]) l = plt.scatter(xLo, yLo, zLo, marker='o',color=colors[1]) a = plt.scatter(xAverage, yAverage, zAverage, marker='o',color=colors[2]) h = plt.scatter(xHi, yHi, zHi, marker='o',color=colors[3]) hh = plt.scatter(xHiHi, yHiHi, zHiHi, marker='o',color=colors[4]) ho = plt.scatter(xHOutlier, yHOutlier, zHOutlier, marker='x', color=colors[4]) plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi',     'High Outlier'),scatterpoints=1, loc='lower left', ncol=3, fontsize=8) 

When I run this, the legend no longer exists, it is a small white box in the corner with nothing in it.

Any advice?

like image 665
user2386081 Avatar asked Jul 01 '13 19:07

user2386081


People also ask

How do you make a legend on a scatter plot?

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.

Can I put legend outside plot Matplotlib?

Matplotlib set legend outside plot In Matplotlib, to set a legend outside of a plot you have to use the legend() method and pass the bbox_to_anchor attribute to it. We use the bbox_to_anchor=(x,y) attribute. Here x and y specify the coordinates of the legend.


1 Answers

2D scatter plot

Using the scatter method of the matplotlib.pyplot module should work (at least with matplotlib 1.2.1 with Python 2.7.5), as in the example code below. Also, if you are using scatter plots, use scatterpoints=1 rather than numpoints=1 in the legend call to have only one point for each legend entry.

In the code below I've used random values rather than plotting the same range over and over, making all the plots visible (i.e. not overlapping each other).

import matplotlib.pyplot as plt from numpy.random import random  colors = ['b', 'c', 'y', 'm', 'r']  lo = plt.scatter(random(10), random(10), marker='x', color=colors[0]) ll = plt.scatter(random(10), random(10), marker='o', color=colors[0]) l  = plt.scatter(random(10), random(10), marker='o', color=colors[1]) a  = plt.scatter(random(10), random(10), marker='o', color=colors[2]) h  = plt.scatter(random(10), random(10), marker='o', color=colors[3]) hh = plt.scatter(random(10), random(10), marker='o', color=colors[4]) ho = plt.scatter(random(10), random(10), marker='x', color=colors[4])  plt.legend((lo, ll, l, a, h, hh, ho),            ('Low Outlier', 'LoLo', 'Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),            scatterpoints=1,            loc='lower left',            ncol=3,            fontsize=8)  plt.show() 

enter image description here

3D scatter plot

To plot a scatter in 3D, use the plot method, as the legend does not support Patch3DCollection as is returned by the scatter method of an Axes3D instance. To specify the markerstyle you can include this as a positional argument in the method call, as seen in the example below. Optionally one can include argument to both the linestyle and marker parameters.

import matplotlib.pyplot as plt from numpy.random import random from mpl_toolkits.mplot3d import Axes3D  colors=['b', 'c', 'y', 'm', 'r']  ax = plt.subplot(111, projection='3d')  ax.plot(random(10), random(10), random(10), 'x', color=colors[0], label='Low Outlier') ax.plot(random(10), random(10), random(10), 'o', color=colors[0], label='LoLo') ax.plot(random(10), random(10), random(10), 'o', color=colors[1], label='Lo') ax.plot(random(10), random(10), random(10), 'o', color=colors[2], label='Average') ax.plot(random(10), random(10), random(10), 'o', color=colors[3], label='Hi') ax.plot(random(10), random(10), random(10), 'o', color=colors[4], label='HiHi') ax.plot(random(10), random(10), random(10), 'x', color=colors[4], label='High Outlier')  plt.legend(loc='upper left', numpoints=1, ncol=3, fontsize=8, bbox_to_anchor=(0, 0))  plt.show() 

enter image description here

like image 118
sodd Avatar answered Sep 24 '22 14:09

sodd