python数据可视化matplotlib(中)
能够画出图像时基本操作。默认的图像好像不怎么好看,但是好看的图像能够让人心旷神怡。难道要用PS搞一下?当然不是啦。接下来我们就通过matplotlib对自己画出来的图像进行一下样式自定义,美化美化图像吧!
设置画布边框
将边框设置为其他颜色
plt.figure(figsize=(18,4))
#x坐标,y坐标,显示样式
plt.text(0.5,0.5,'Content',ha='center',va='center',size=20,alpha=5)
#设置边框
axes = plt.gca()
axes.spines['top'].set_color('blue')
axes.spines['right'].set_color('red')
plt.show()
不显示选择的部分边框:
plt.figure(figsize=(18,4))
#x坐标,y坐标,显示样式
plt.text(0.5,0.5,'Content',ha='center',va='center',size=20,alpha=5)
#设置边框
axes = plt.gca()
axes.spines['top'].set_color(None)
axes.spines['right'].set_color(None)
plt.show()
定义图形样式
怎么样让图形更美观?
当然是通过更多的参数来让图形变得更漂亮。
线形图通过 matplotlib.pyplot.plot(*args, **kwargs)
方法绘出。其中,args
代表数据输入,而 kwargs
的部分就是用于设置样式参数了。
二维线形图,详细可点: 包含的参数 超过 40 余项(点击去看看,文档最后有几个值得一看的demo哦),其中常用的也有 10 余项,这里我选取一些比较常用的参数列举如下:
参数 | 含义 |
---|---|
alpha= | 设置线型的透明度,从 0.0 到 1.0 |
color= 或 c= | 设置线型的颜色 |
fillstyle= | 设置线型的填充样式 |
linestyle= | 设置线型的样式 |
linewidth= | 设置线型的宽度 |
marker= | 设置标记点的样式 |
…… | …… |
颜色
可以通过调用matplotlib.pyplot.colors()得到matplotlib支持的所有颜色。
别名 | 颜色 | 别名 | 颜色 |
---|---|---|---|
b | 蓝色 | g | 绿色 |
r | 红色 | y | 黄色 |
c | 青色 | k | 黑色 |
m | 洋红色 | w | 白色 |
如果这里颜色不够用,还可以通过两种其他方式来定义颜色值:
- 使用HTML十六进制字符串 color=‘eeefff’ 使用合法的HTML颜色名字(’red’,’chartreuse’等)。
- 还可以传入一个归一化到[0,1]的RGB元祖。 color=(0.3,0.3,0.4)
很多方法可以介绍颜色参数,如title()。
plt.tilte(‘Title in a custom color’,color=’#123456’)
线条相关属性标记设置
用来该表线条的属性
线条风格linestyle或ls | 描述 | 线条风格linestyle或ls | 描述 |
---|---|---|---|
‘-‘ | 实线 | ‘:’ | 虚线 |
‘–’ | 破折线 | ‘None’,’ ‘,’’ | 什么都不画 |
‘-.’ | 点划线 |
线条标记
标记maker | 描述 | 标记 | 描述 |
---|---|---|---|
‘o’ | 圆圈 | ‘.’ | 点 |
‘D’ | 菱形 | ‘s’ | 正方形 |
‘h’ | 六边形1 | ‘*’ | 星号 |
‘H’ | 六边形2 | ‘d’ | 小菱形 |
‘_’ | 水平线 | ‘v’ | 一角朝下的三角形 |
‘8’ | 八边形 | ‘<’ | 一角朝左的三角形 |
‘p’ | 五边形 | ‘>’ | 一角朝右的三角形 |
‘,’ | 像素 | ‘^’ | 一角朝上的三角形 |
‘+’ | 加号 | ‘\ ‘ | 竖线 |
‘None’,’’,’ ‘ | 无 | ‘x’ | X |
可以通过一个一个参数去定义也可以通过一个字符串把这些特殊的标记传入。看看他们都长什么样子吧。
设置颜色的方法
fig, axes = plt.subplots()#fig为整个窗体,axes表示对应的画布
axes.plot(x, x+1, color="red", alpha=0.5)
axes.plot(x, x+2, color="#1155dd")
axes.plot(x, x+3, color="#15cc55")
线条样式
fig, ax = plt.subplots(figsize=(12, 6))
# 线宽
ax.plot(x, x+1, color="blue", linewidth=0.25)
ax.plot(x, x+2, color="blue", linewidth=0.50)
ax.plot(x, x+3, color="blue", linewidth=1.00)
ax.plot(x, x+4, color="blue", linewidth=2.00)
# 虚线类型
ax.plot(x, x+5, color="red", lw=2, linestyle='-')
ax.plot(x, x+6, color="red", lw=2, ls='-.')
ax.plot(x, x+7, color="red", lw=2, ls=':')
# 虚线交错宽度
line, = ax.plot(x, x+8, color="black", lw=1.50)
line.set_dashes([5, 10, 15, 10])
# 符号
ax.plot(x, x + 9, color="green", lw=2, ls='--', marker='+')
ax.plot(x, x+10, color="green", lw=2, ls='--', marker='o')
ax.plot(x, x+11, color="green", lw=2, ls='--', marker='s')
ax.plot(x, x+12, color="green", lw=2, ls='--', marker='1')
# 符号大小和颜色
ax.plot(x, x+13, color="purple", lw=1, ls='-', marker='o', markersize=2)
ax.plot(x, x+14, color="purple", lw=1, ls='-', marker='o', markersize=4)
ax.plot(x, x+15, color="purple", lw=1, ls='-',
marker='o', markersize=8, markerfacecolor="red")
ax.plot(x, x+16, color="purple", lw=1, ls='-', marker='s', markersize=8,
markerfacecolor="yellow", markeredgewidth=2, markeredgecolor="blue")
眼花缭乱,自己选择吧,喜欢那个用那个。
混合设置样式
如果懒得一个一个名称去写也可以用一个字符串把东西都装起来(不推荐)。
# 在 -2PI 和 2PI 之间等间距生成 1000 个值,也就是 X 坐标
X = np.linspace(-2 * np.pi, 2 * np.pi, 1000)#横坐标
y1 = np.sin(X)# 计算生成纵坐标
y2 = np.cos(X)# 计算生成对应的纵坐标
# 向方法中 `*args` 输入 X,y 坐标
plt.plot(X, y1, color='r', linestyle='--', linewidth=2, alpha=0.8) #红色,虚线为SIN
plt.plot(X, y2, '4-b')#直接用一个字符串定义
散点图的设置
散点图也是相似的,它们的很多样式参数都是大同小异,需要阅读 官方文档 详细了解。
参数 | 含义 |
---|---|
s= | 散点大小 |
c= | 散点颜色 |
marker= | 散点样式 |
cmap= | 定义多类别散点的颜色 |
alpha= | 点的透明度 |
edgecolors= | 散点边缘颜色 |
我们来看看花里胡哨的散点图:
# 生成随机数据,100个随机点,通过x和y构造对应坐标
x = np.random.rand(100)
y = np.random.rand(100)
colors = np.random.rand(100)#生成一个颜色数组,数量为100
size = np.random.normal(50, 60, 10)#产生一个服从高斯分布的数组,描述对应的点的大小
plt.scatter(x, y, s=size, c=colors) # 绘制散点图
规范绘图方法
首先,任何图形的绘制,都建议通过 plt.figure()
或者 plt.subplots()
管理一个完整的图形对象。而不是简单使用一条语句,例如 plt.plot(...)
来绘图。
管理一个完整的图形对象,有很多好处。在图形图形的基础上,给后期添加图例,图形样式,标注等预留了很大的空间。除此之外。代码看起来也更加规范,可读性更强。
管理绘图的常用函数
函数 | 描述 |
---|---|
set_xlabel/set_ylabel/xlabel/ylabel | 设置x、y坐标轴标题 |
set_title | 设置图片标题 |
legend([描述列表], loc=位置) | 添加图例,描述列表需要按照绘图的顺序来定义 |
grid(True) | 网格线显示 |
set_xlim/set_ylim/xlim/ylim | 设置坐标显示范围 |
xticks/yticks | 设置显示刻度 |
text() | 设置文本显示 |
annotate() | 设置箭头标注 |
%matplotlib inline
from matplotlib import pyplot as plt
x = np.linspace(0, 10, 20) # 生成横坐标数据
fig, axes = plt.subplots()
axes.set_xlabel('x label') # 横轴名称
axes.set_ylabel('y label') #纵轴名称
axes.set_title('title') # 图形名称,即标题
axes.grid(True)#显示网格线
axes.plot(x, x**2)
axes.plot(x, x**3)
axes.legend(["$y = x^{2}$", "$y = x^{3}$"], loc=0) # 图例,loc确定显示的位置,传入一个列表用于对应的图例内容,需要按照绘制的顺序进行
设置了标题、轴标签、网格线、图例,看起来公整了许多。
设置图内标注以及箭头
有些时候,我们要特别说明一下图中的数据的时候,我们可以在图中进行标注,
这时候可以用到plt.text()以及plt.annotate()进行纯文本和箭头标注。
fig, axes = plt.subplots()
x_bar = [10, 20, 30, 40, 50] # 柱形图横坐标
y_bar = [0.5, 0.6, 0.3, 0.4, 0.8] # 柱形图纵坐标
bars = axes.bar(x_bar, y_bar, color='blue', label=x_bar, width=2) # 绘制柱形图
for i, rect in enumerate(bars):
x_text = rect.get_x() # 获取柱形图横坐标
y_text = rect.get_height() + 0.01 # 获取柱子的高度并增加 0.01
plt.text(x_text, y_text, '%.1f' % y_bar[i]) # 标注文字
# 增加箭头标注
plt.annotate('Max', xy=(48, 0.8), xytext=(36, 0.7),
arrowprops=dict(facecolor='black', width=1, headwidth=7))
plt.annotate('Min', xy=(32, 0.3), xytext=(36, 0.3),
arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=1'))
plt.show()
plt.annotate('Max', xy=(48, 0.8), xytext=(36, 0.7), arrowprops=dict(facecolor='black', width=1, headwidth=7))
特别解析一下这个,xy是指定箭头的头部的位置,xytext是文字显示的位置,arrowprops是对箭头的其他配置,颜色、箭头本身宽度、箭头头部宽度、arrowstyle为箭头样式,connectionstyle设置箭头的弯曲样式,后面的1为弯曲程度。
在plot上的样式设置跟其他的图像函数是不是会不一样?
n = np.array([0, 1, 2, 3, 4, 5])
fig, axes = plt.subplots(1, 4, figsize=(16, 5))
axes[0].scatter(x, x + 0.25*np.random.randn(len(x)))
axes[0].set_title("scatter")
axes[1].step(n, n**2, lw=2)
axes[1].set_title("step")
axes[2].bar(n, n**2, align="center", width=0.5, alpha=0.5)
axes[2].set_title("bar")
axes[3].fill_between(x, x**2, x**3, color="green", alpha=0.5)#填充颜色
axes[3].set_title("fill_between")
写在最后
动手练练吧。后面如果还发现什么好玩的样式设置,我会继续完善的。实践是检验真理的唯一标准,实战是学习的最好途径。下篇我会在一些demo中加入一些别样的样式设置,去看看吧。