Python进阶篇(三)-- Matplotlib绘图进阶

        Matplotlib是Python中令人惊叹的可视化库,用于数组的二维图。 Matplotlib是一个基于NumPy数组的多平台数据可视化库,旨在与更广泛的SciPy堆栈配合使用。

1 保存图形时坐标轴标签太长导致显示不全的问题

1. 问题描述
        在使用matplotlib绘制图像并保存时,由于标签太长,导致坐标轴上的标签显示不全的问题。刚遇到问题时调整了一下图片大小,然鹅并没有卵用。

        查看一下matplotlib的文档:matplotlib.pyplot.savefig(),可以看到:

Python进阶篇(三)-- Matplotlib绘图进阶_第1张图片

        默认情况下,仅保存图形给定的部分,如果设置为tight,将尝试保存更紧致的图形。

2. 解决办法
        在保存图形是加入bbox_inches参数:

# 设置tight bbox
fig.savefig('output.png', bbox_inches='tight')

2 contourf()函数的使用

        contourf()是来绘制等高线的,contour和contourf都是画三维等高线图的,不同点在于contour()是绘制轮廓线,contourf()会填充轮廓。除非另有说明,否则两个版本的函数是相同的。

coutour([X, Y,] Z,[levels], **kwargs)
参数: X,Y:类似数组,可选
  为Z中的坐标值
  当 X,Y,Z 都是 2 维数组时,它们的形状必须相同。如果都是 1 维数组时,len(X)是 Z 的列数,而 len(Y) 是 Z 中的行数。(例如,经由创建numpy.meshgrid()
  Z:类似矩阵
  绘制轮廓的高度值
  levels:int或类似数组,可选
  确定轮廓线/区域的数量和位置

 

 
其他参数: aalpha:float ,可选
  alpha混合值,介于0(透明)和1(不透明)之间。
  cmap:str或colormap ,可选
  Colormap用于将数据值(浮点数)从间隔转换为相应Colormap表示的RGBA颜色。用于将数据缩放到间隔中看 。

        要画出等高线,核心函数是plt.contourf(),但在这个函数中输入的参数是 x , y x,y x,y对应的网格数据以及此网格对应的高度值,因此我们调用np.meshgrid(x,y) x , y x,y x,y值转换成网格数据:

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

def f(x, y):
    return (1 + x**3 + y**5) * np.exp(-x**2-y**2)

a = np.linspace(-3, 3)
X, Y = np.meshgrid(a, a)	# 把x,y数据生成mesh网格状的数据,因为等高线的显示是在网格的基础上添加上高度值

plt.contourf(X, Y, f(X, Y))
plt.show()
Python进阶篇(三)-- Matplotlib绘图进阶_第2张图片

        如果想显示热力图,那只要在plt.contourf()函数中添加属性cmap=plt.cm.hot就能显示热力图,其中cmap代表为color map,我们把color map映射成hot(热力图)

plt.contourf(X, Y, f(X, Y), cmap=plt.cm.hot)
Python进阶篇(三)-- Matplotlib绘图进阶_第3张图片

3 Matplotlib.colors.ListedColormap

        matplotlib.colors.ListedColormap类属于matplotlib.colors模块。 matplotlib.colors模块用于将颜色或数字参数转换为RGBA或RGB。此模块用于将数字映射到颜色或以一维颜色数组(也称为colormap)进行颜色规格转换。

        matplotlib.colors.ListedColormap类用于从颜色列表创建colarmap对象。这对于直接索引到颜色表中很有用,也可以用于为法线贴图创建特殊的颜色表。

        用法: class matplotlib.colors.ListedColormap(colors, name=’from_list’, N=None)
        参数:

  • 颜色:它是Matplotlib颜色规格的数组或列表,或等于N x 3或N x 4浮点数组(N rgb或rgba值)
  • 名称:它是一个可选参数,它接受一个字符串来标识颜色图。
  • N:它是一个可选参数,它接受表示映射中条目数的整数值。它的默认值为“无”,其中颜色列表中的每个元素都有一个颜色表条目。如果N小于len(colors),则列表将在N处截断,而如果N大于len,则列表将重复进行扩展。

        该类的方法:reversed():这用于创建Colormap的反向实例。
        用法: reversed(self, name=None)
        参数:

  • name:它是一个可选参数,表示反转的颜色图的名称。如果将其设置为“无”,则名称将为父色图的名称+ “_r”。
    返回值:它返回颜色图的反向实例

示例一:

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

a = np.linspace(-3, 3)
A, B = np.meshgrid(a, a)    # 生成网格
X = np.exp(-(A**2 + B**2))
figure, (axes1, axes2) = plt.subplots(ncols = 2)

colors = ["green", "orange", "gold", "blue", "k", "#550011", "purple", "red"]

axes1.set_title("color list")
contour = axes1.contourf(A, B, X, colors = colors)      # 绘制等高线, contour() 是绘制轮廓线,contourf()会填充轮廓

axes2.set_title("with colormap")
cmap = ListedColormap(colors)
contour = axes2.contourf(A, B, X, cmap = cmap)
figure.colorbar(contour)

plt.show()
Python进阶篇(三)-- Matplotlib绘图进阶_第4张图片

示例二:

import matplotlib.pyplot as plt 
import numpy as np 
import matplotlib.colors as colors 
from mpl_toolkits.axes_grid1 import make_axes_locatable 
  
res = np.array([[0, 2], [3, 4]], dtype = int) 
  
u = np.unique(res) 
bounds = np.concatenate(([res.min()-1], 
                         u[:-1]+np.diff(u)/2., 
                         [res.max()+1])) 
  
norm = colors.BoundaryNorm(bounds, len(bounds)-1) 
color_map1 = ['#7fc97f', '#ffff99', '#386cb0', '#f0027f'] 
color_map = colors.ListedColormap(color_map1)  
  
fig, axes = plt.subplots() 
img = axes.imshow(res, cmap = color_map, 
                  norm = norm) 
divider = make_axes_locatable(axes) 
cax = divider.append_axes("right", size ="5 %") 
  
color_bar = plt.colorbar(img, cmap = color_map,  
                         norm = norm, cax = cax) 
  
color_bar.set_ticks(bounds[:-1]+np.diff(bounds)/2.) 
color_bar.ax.set_yticklabels(color_map1) 
color_bar.ax.tick_params(labelsize = 10) 
  
plt.show()
Python进阶篇(三)-- Matplotlib绘图进阶_第5张图片

后续会继续补充~

你可能感兴趣的:(Python,1024程序员节,Python,contourf,ListedColormap,Matplotlib)