Matplotlib是Python中令人惊叹的可视化库,用于数组的二维图。 Matplotlib是一个基于NumPy数组的多平台数据可视化库,旨在与更广泛的SciPy堆栈配合使用。
1. 问题描述
在使用matplotlib
绘制图像并保存时,由于标签太长,导致坐标轴上的标签显示不全的问题。刚遇到问题时调整了一下图片大小,然鹅并没有卵用。
查看一下matplotlib的文档:matplotlib.pyplot.savefig()
,可以看到:
默认情况下,仅保存图形给定的部分,如果设置为tight
,将尝试保存更紧致的图形。
2. 解决办法
在保存图形是加入bbox_inches
参数:
# 设置tight bbox
fig.savefig('output.png', bbox_inches='tight')
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()
如果想显示热力图,那只要在plt.contourf()
函数中添加属性cmap=plt.cm.hot
就能显示热力图,其中cmap代表为color map,我们把color map映射成hot(热力图)
plt.contourf(X, Y, f(X, Y), cmap=plt.cm.hot)
matplotlib.colors.ListedColormap
类属于matplotlib.colors模块。 matplotlib.colors模块用于将颜色或数字参数转换为RGBA或RGB。此模块用于将数字映射到颜色或以一维颜色数组(也称为colormap)进行颜色规格转换。
matplotlib.colors.ListedColormap
类用于从颜色列表创建colarmap对象。这对于直接索引到颜色表中很有用,也可以用于为法线贴图创建特殊的颜色表。
用法: class matplotlib.colors.ListedColormap(colors, name=’from_list’, N=None)
参数:
该类的方法:reversed()
:这用于创建Colormap的反向实例。
用法: reversed(self, name=None)
参数:
示例一:
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()
示例二:
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()
后续会继续补充~