简体   繁体   English

Matplotlib 散点图图例

[英]Matplotlib scatter plot legend

I created a 4D scatter plot graph to represent different temperatures in a specific area.我创建了一个 4D 散点图来表示特定区域的不同温度。 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 .我尝试将Line2D更改为Scatterscatter Scatter returned an error and scatter changed the graph and returned an error. Scatter返回错误, scatter更改图形并返回错误。

With scatter , I changed the range(10) to the lists containing the data points.使用scatter ,我将range(10)更改为包含数据点的列表。 Each list contains either the x, y, or z variable.每个列表包含 x、y 或 z 变量。

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?有什么建议吗?

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.使用matplotlib.pyplot模块的scatter方法应该可以工作(至少在 matplotlib 1.2.1 和 Python 2.7.5 中),如下面的示例代码所示。 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.此外,如果您使用scatterpoints=1 ,请在图例调用中使用numpoints=1而不是numpoints=1以使每个图例条目只有一个点。

In the code below I've used random values rather than plotting the same range over and over, making all the plots visible (ie 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()

在此处输入图片说明

3D scatter plot 3D散点图

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.要绘制三维分散,使用plot法,如传奇不支持Patch3DCollection如通过返回scatter的方法Axes3D实例。 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.可选地,可以包含linestylemarker参数的参数。

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()

在此处输入图片说明

if you are using matplotlib version 3.1.1 or above, you can try:如果您使用的是 matplotlib 3.1.1 或更高版本,您可以尝试:

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

x = [1, 3, 4, 6, 7, 9]
y = [0, 0, 5, 8, 8, 8]
classes = ['A', 'B', 'C']
values = [0, 0, 1, 2, 2, 2]
colours = ListedColormap(['r','b','g'])
scatter = plt.scatter(x, y,c=values, cmap=colours)
plt.legend(handles=scatter.legend_elements()[0], labels=classes)

结果2

Other answers seem a bit complex, you can just add a parameter 'label' in scatter function and that will be the legend for your plot.其他答案似乎有点复杂,您只需在 scatter 函数中添加一个参数“标签”,这将成为您绘图的图例。

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],label='Low Outlier')
ll = plt.scatter(random(10), random(10), marker='o', color=colors[0],label='LoLo')
l  = plt.scatter(random(10), random(10), marker='o', color=colors[1],label='Lo')
a  = plt.scatter(random(10), random(10), marker='o', color=colors[2],label='Average')
h  = plt.scatter(random(10), random(10), marker='o', color=colors[3],label='Hi')
hh = plt.scatter(random(10), random(10), marker='o', color=colors[4],label='HiHi')
ho = plt.scatter(random(10), random(10), marker='x', color=colors[4],label='High Outlier')

plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
          fancybox=True, shadow=True, ncol=4)

plt.show()

This is your output:这是你的输出:

图片

Here's an easier way of doing this (source: here ):这是一种更简单的方法(来源: 此处):

import matplotlib.pyplot as plt
from numpy.random import rand


fig, ax = plt.subplots()
for color in ['red', 'green', 'blue']:
    n = 750
    x, y = rand(2, n)
    scale = 200.0 * rand(n)
    ax.scatter(x, y, c=color, s=scale, label=color,
               alpha=0.3, edgecolors='none')

ax.legend()
ax.grid(True)

plt.show()

And you'll get this:你会得到这个:

在此处输入图片说明

Take a look at here for legend properties看看这里的图例属性

I created a legend list of unique values for year which I use as a color in my scatter plot.我创建了一个年份唯一值的图例列表,我将其用作散点图中的颜色。 The scatterplot variable is called result.散点图变量称为结果。 result.legend_elements()[0] returns a list of colors and I set the color map to values using labels=legend, my list of years. result.legend_elements()[0] 返回一个颜色列表,我使用labels=legend,我的年份列表将颜色映射设置为值。

legend=[str(year) for year in df['year'].unique()]
plt.title('Battery Capicity kwh')


result = plt.scatter('Approx_Release_price_order_in_K$','Battery_Capacity_kWh',data=df,c='year',label='Class 1')
plt.ylabel('kwh')
plt.xlabel('K$')
plt.legend(handles=result.legend_elements()[0], 
       labels=legend,
       title="Year")
print('The higher priced evs have more battery capacity')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM