文章目录
Matplotlib配置图例与颜色条
前面讲解过,如何给图像增加图例,可以统一给plt.legend()传入名称数组,也可以在每个图线中指定label属性
但是这两种方式都仅仅是简单的为图片添加图例,我们这一节将讲解如何对图例进行高级别的配置
颜色条也是同样,之前只是显示出颜色条,这一节将会讲解如何对颜色条进行配置
配置图例
默认情况下的图例
我们首先创建一个最简单的图例
x=np.linspace(start=-np.pi,stop=np.pi,num=300)
plt.style.use('classic')
Fig,Axes=plt.subplots(1)
Axes.plot(x,np.sin(x),'-b',label='Sine')
Axes.plot(x,np.cos(x),'--r',label='Cosine')
Axes.axis('equal')
Axes.legend()
plt.show()
可以看到,默认情况下图例是添加在图像的右上角
图例外观设定
指定loc参数设定图例位置
我们可以指定loc参数来设置图例的位置
x=np.linspace(start=-np.pi,stop=np.pi,num=300)
plt.style.use('classic')
Fig,Axes=plt.subplots(1)
Axes.plot(x,np.sin(x),'-b',label='Sine')
Axes.plot(x,np.cos(x),'--r',label='Cosine')
Axes.axis('equal')
Axes.legend(loc='upper left')
plt.show()
指定frameon参数来设定边框
默认情况下图例的边框是开启的,我们可以指定frameon参数来取消边框
x=np.linspace(start=-np.pi,stop=np.pi,num=300)
plt.style.use('classic')
Fig,Axes=plt.subplots(1)
Axes.plot(x,np.sin(x),'-b',label='Sine')
Axes.plot(x,np.cos(x),'--r',label='Cosine')
Axes.axis('equal')
Axes.legend(loc='lower center',frameon=False)
plt.show()
指定ncol参数来设定标签列数
我们可以使用ncol参数来设定标签的列数
x=np.linspace(start=-np.pi,stop=np.pi,num=300)
plt.style.use('classic')
Fig,Axes=plt.subplots(1)
Axes.plot(x,np.sin(x),'-b',label='Sine')
Axes.plot(x,np.cos(x),'--r',label='Cosine')
Axes.axis('equal')
Axes.legend(loc='lower center',frameon=False,ncol=2)
plt.show()
指定圆角边框,增加边框阴影与改变边框透明度
我们分别可以指定fancybox来指定圆角边框,设定shadow参数为True添加阴影,设定framealpha来设定边框透明度,设定borderpad来设定文字举例边框距离
x=np.linspace(start=-np.pi,stop=np.pi,num=300)
plt.style.use('seaborn')
Fig,Axes=plt.subplots(1)
Axes.plot(x,np.sin(x),'-b',label='Sine')
Axes.plot(x,np.cos(x),'--r',label='Cosine')
Axes.axis('equal')
Axes.legend(loc='upper center',frameon=True,ncol=2,framealpha=1,fancybox=True,shadow=True,borderpad=1)
plt.show()
选择图例现实的元素
在默认状态下,图例会显示所有元素的标签,如果我们不想显示其中的全部,我们可以通过一些图形命令来指定显示图例中哪些元素和标签
我们有两种方法来指定图例将会显示的元素,第一种是将需要显示的线条传入plt.legend,第二种是为需要显示图例的线条设置label参数
为plt.legend()传入需要显示的线条
我们为plt.plot()可以传入一个多维数组和一维数组,这样plt.plot会自动的以一维数组作为x坐标值,多维数组的每列作为y坐标值进行绘图
而且plt.plot()实际上在绘完图线之后会返回元素为plt.Line2D对象的列表
x=np.linspace(start=-np.pi,stop=np.pi,num=300)
plot=plt.plot(x,np.sin(x))
print(type(plot[0]))
>>>
<class 'matplotlib.lines.Line2D'>
所以我们实际上对线条的样式不仅可以通过plt.plot()在绘图时候指定,其实也可以调用plt.Line2D对象的方法来进行修改
不过这里只讲解显示指定的元素.所以我们实际上可以绘制多条线,得到一个包含所有线的plt.Line2D对象的列表,接下来将需要显示图例的线条传入plt.legend即可
x=np.linspace(start=-np.pi,stop=np.pi,num=300)
y=np.sin(x[:,np.newaxis]+np.pi*np.arange(start=0,stop=2,step=0.5)) #注意这里发生了广播所以y是一个高维数组
lines=plt.plot(x,y)
plt.legend(lines[:2],['first','second'])
plt.show()
这里我们一共生成了四条线,表现在图像上依次向左平移(左加右减),我们为前两条线,分别是蓝线和蓝线向左平移一个单位得到的橙线添加图例
为需要显示的线设置label参数
plt.plot(x,y[:,2],label='Third')
plt.plot(x,y[:,3],label='Forth')
plt.legend()
plt.show()
在图例中显示不同尺寸的点
下面我们将以加利福尼亚州所有城市的数据(提取码666)为例来绘图,最终效果是将绘制出各个城市的位置,同时以城市面积大小来使用不同大小的圆表示
cities=pd.read_csv('california_cities.csv')
latitude,longitude=cities['latd'],cities['longd']
population,area=cities['population_total'],cities['area_total_km2']
plt.scatter(latitude,longitude,label=None,c=np.log10(population),cmap='viridis',s=area,linewidths=0,alpha=0.5)
plt.axis(aspect='euqal')a
plt.xlabel('Logitude')
plt.ylabel('Latitude')
plt.colorbar(label='log_{10}$(population)')
plt.clim(3,7)
for area in [100,300,500]:
plt.scatter([],[],c='k',alpha=0.3,s=area,label=str(area)+' km$^2$')
plt.legend(scatterpoints=1,frameon=False,labelspacing=1,title='City Area')
plt.title('California Cities : Area and Population')
plt.show()
注意,这里我们实际上一共使用了四次plt.scatter()函数,其中只有第一次实际上绘制了图片里的所有的点,而剩下的三个plt.scatter()函数实际上都是在循环中使用的.后面的三次plt.scatter()函数实际上都没有绘图,而是用于添加图例
label参数实际上会以当前绘制图像中的点为例,然后附加上我们给label参数的说明.而前面的列表只是告诉Matplotlib我们该在哪些地方画点,所以即便我们传入两个空列表(表示不再任何地方画点),也不会影响我们图例中的图像的显示
也正是因为label会以图像中的点为例,因此我们只要控制点的大小和颜色就能分别绘制图例中的三个元素
所以根据以上讲解,我们可以这样创建一个图例
La=1
for color in list('cmyk'):
plt.scatter([],[],c=color,s=100,label=La)
La+=1
plt.legend(frameon=False)
plt.show()
同时显示多个图例
有的时候,由于排版问题,我们可能需要在同一张图像上显示多个图例.但是用Matplotlib来解决这个问题其实并不容易,因为标准的legend接口只支持为一张图像创建一个图例.如果我们使用legend接口再创建第二个,那么第一个图例就会被覆盖
Matplotlib中我们解决这个问题就是创建一个图例艺术家对象,然后调用底层的ax.add_artist()方法来为图片添加第二个图例
Fig,Axes=plt.subplots(1)
lines=[]
style=['-','--','-.',':']
x=np.linspace(start=-np.pi,stop=np.pi,num=500)
for i in range(4):
lines+= Axes.plot(x,np.sin(x-i*np.pi/2),style[i],color='black')
Axes.axis('equal')
Axes.legend(lines[:2],['Line A','Line B'],loc='uppper right',frameon=False)
from matplotlib.legend import Legend
Leg=Legend(Axes,lines[2:],['Line C','Line D'],loc='lower right',frameon=False)
Axes.add_artist(Leg)
plt.show()
这里第12行,我们首先使用正常的方法创建了第一个图例,接下来我们从matplotlib的legend库中导入了Legend对象,我们实例化一个Legend对象之后,调用Axes对象的add_artist底层方法来添加图例
配置颜色条
图例是通过离散的标签值来表示离散的图形元素的含义的对象.但是对于由色彩来表示不同含义的点,线,面构成的连续坐标或图像,用颜色条来表示的效果比较好.
在Matplotlib中,颜色条是一个独立的坐标轴,可以用以指明图形中颜色的含义
默认情况下的颜色条
我们直接使用plt.colorbar()调出的就是默认情况下的颜色条
x=np.linspace(start=0,stop=10,num=1000)
Z=np.sin(x)*np.cos(x[:,np.newaxis])
plt.imshow(Z)
plt.colorbar()
plt.show()
配置颜色条的配色方案
配置颜色条的配色方案,实际上就是对图像的颜色进行配置,即指定绘图函数中的cmap参数来指定颜色条的配色方案
所有的配色方案
所有的配色方案如下
‘Accent’, ‘Accent_r’, ‘Blues’, ‘Blues_r’, ‘BrBG’, ‘BrBG_r’, ‘BuGn’, ‘BuGn_r’, ‘BuPu’, ‘BuPu_r’, ‘CMRmap’, ‘CMRmap_r’, ‘Dark2’, ‘Dark2_r’, ‘GnBu’, ‘GnBu_r’, ‘Greens’, ‘Greens_r’, ‘Greys’, ‘Greys_r’, ‘OrRd’, ‘OrRd_r’, ‘Oranges’, ‘Oranges_r’, ‘PRGn’, ‘PRGn_r’, ‘Paired’, ‘Paired_r’, ‘Pastel1’, ‘Pastel1_r’, ‘Pastel2’, ‘Pastel2_r’, ‘PiYG’, ‘PiYG_r’, ‘PuBu’, ‘PuBuGn’, ‘PuBuGn_r’, ‘PuBu_r’, ‘PuOr’, ‘PuOr_r’, ‘PuRd’, ‘PuRd_r’, ‘Purples’, ‘Purples_r’, ‘RdBu’, ‘RdBu_r’, ‘RdGy’, ‘RdGy_r’, ‘RdPu’, ‘RdPu_r’, ‘RdYlBu’, ‘RdYlBu_r’, ‘RdYlGn’, ‘RdYlGn_r’, ‘Reds’, ‘Reds_r’, ‘Set1’, ‘Set1_r’, ‘Set2’, ‘Set2_r’, ‘Set3’, ‘Set3_r’, ‘Spectral’, ‘Spectral_r’, ‘Wistia’, ‘Wistia_r’, ‘YlGn’, ‘YlGnBu’, ‘YlGnBu_r’, ‘YlGn_r’, ‘YlOrBr’, ‘YlOrBr_r’, ‘YlOrRd’, ‘YlOrRd_r’, ‘afmhot’, ‘afmhot_r’, ‘autumn’, ‘autumn_r’, ‘binary’, ‘binary_r’, ‘bone’, ‘bone_r’, ‘brg’, ‘brg_r’, ‘bwr’, ‘bwr_r’, ‘cividis’, ‘cividis_r’, ‘cool’, ‘cool_r’, ‘coolwarm’, ‘coolwarm_r’, ‘copper’, ‘copper_r’, ‘cubehelix’, ‘cubehelix_r’, ‘flag’, ‘flag_r’, ‘gist_earth’, ‘gist_earth_r’, ‘gist_gray’, ‘gist_gray_r’, ‘gist_heat’, ‘gist_heat_r’, ‘gist_ncar’, ‘gist_ncar_r’, ‘gist_rainbow’, ‘gist_rainbow_r’, ‘gist_stern’, ‘gist_stern_r’, ‘gist_yarg’, ‘gist_yarg_r’, ‘gnuplot’, ‘gnuplot2’, ‘gnuplot2_r’, ‘gnuplot_r’, ‘gray’, ‘gray_r’, ‘hot’, ‘hot_r’, ‘hsv’, ‘hsv_r’, ‘inferno’, ‘inferno_r’, ‘jet’, ‘jet_r’, ‘magma’, ‘magma_r’, ‘nipy_spectral’, ‘nipy_spectral_r’, ‘ocean’, ‘ocean_r’, ‘pink’, ‘pink_r’, ‘plasma’, ‘plasma_r’, ‘prism’, ‘prism_r’, ‘rainbow’, ‘rainbow_r’, ‘seismic’, ‘seismic_r’, ‘spring’, ‘spring_r’, ‘summer’, ‘summer_r’, ‘tab10’, ‘tab10_r’, ‘tab20’, ‘tab20_r’, ‘tab20b’, ‘tab20b_r’, ‘tab20c’, ‘tab20c_r’, ‘terrain’, ‘terrain_r’, ‘twilight’, ‘twilight_r’, ‘twilight_shifted’, ‘twilight_shifted_r’, ‘viridis’, ‘viridis_r’, ‘winter’, ‘winter_r’
他们都位于plt.cm的命名空间中
确定需要的配色方案
实际上关于配色方案的选择并不在如何使用工具的讲解中出现,这里只是简单的讲下
根据我们需要配色的对象的数值不同,我们通常只重点关注三种不同的配色方案
- 顺序配色方案:由一组连续的颜色构成的配色方案,例如:binary或viridis
- 互逆配色方案:通常由梁总互补的颜色构成,表示正反两种含义.例如:RdGy或PuOr
- 定性配色方案:随机顺序的一组颜色,只需要区别图中的每个元素,例如:rainbow或jet
下面我们将看看每种配色方案的效果
更多的颜色设置,自己一一尝试即可
配置颜色条的范围
我们可以使用plt.clim来配置颜色条的刻度范围,同时我们也能够指定plt.colorbar()的extend参数来指定是否使用上下箭头来表示超出范围的值
plt.figure(figsize=(10,3.5))
x=np.linspace(start=0,stop=10,num=1000)
Z=np.sin(x)*np.cos(x[:,np.newaxis])
plt.subplot(1,2,1)
plt.imshow(Z,cmap='RdBu')
plt.colorbar()
plt.subplot(1,2,2)
plt.imshow(Z,cmap='RdBu')
plt.colorbar(extend='both')
plt.clim(-1,1)
plt.show()
配置离散的颜色条
虽然默认所有颜色调都是连续的,但是有的时候我们可能需要使用颜色条来表示离散值,为此,我们可以使用离散的颜色条
最简单的做法就是使用plt.cm.get_cmap()函数,将配色方案和需要离散的区间格式传入进去即可
x=np.linspace(start=0,stop=10,num=1000)
Z=np.sin(x)*np.cos(x[:,np.newaxis])
plt.imshow(Z,cmap=plt.cm.get_cmap('RdBu',6))
plt.colorbar()
plt.show()