Python-Matplotlib可视化(3)——自定义样式绘制精美统计图

  • 前言
  • 控制线条样式和线宽
    • 线条样式
    • 线宽
  • 控制填充样式
  • 控制标记样式
  • 控制标记大小
  • 创建自定义标记
  • 总结——对标记进行更精细控制
  • 系列链接

前言

matplotlib提供的所有绘图都带有默认样式。虽然这可以进行快速绘图,但有时可能需要自定义绘图的颜色和样式,以对绘制更加精美、符合审美要求的图像。matplotlib的设计考虑到了此需求,很容易调整matplotlib图形的样式。

控制线条样式和线宽

在实践中,除了颜色,大多数情况下我们还要对图形的线条样式等进行控制,以为线条样式添加多样性。

线条样式

import numpy as np
import matplotlib.pyplot as plt
def gaussian(x, mu, sigma):a = 1. / (sigma * np.sqrt(2. * np.pi))b = -1. / (2. * sigma ** 2)return a * np.exp(b * (x - mu) ** 2)
x = np.linspace(-6, 6, 1024)
plt.plot(x, gaussian(x, 0., 1.), color = 'y', linestyle = 'solid')
plt.plot(x, gaussian(x, 0., .5), color = 'c', linestyle = 'dashed')
plt.plot(x, gaussian(x, 0., .25), color = 'm', linestyle = 'dashdot')
plt.show()


Tips:使用plt.plot()的linestyle参数来控制曲线的样式,其他可用线条样式包括:"solid"、"dashed"、"dotted"、"dashdot"。
同样,线条样式设置不仅限于plt.plot(),任何由线条构成的图形都可以使用此参数,也可以说linestyle参数可用于所有涉及线条渲染的命令。例如,可以修改条形图的线条样式:

import numpy as np
import matplotlib.pyplot as plt
n = 10
a = np.random.random(n)
b = np.random.random(n)
x = np.arange(n)
plt.bar(x, a, color='c')
plt.bar(x, a+b, bottom=a, color='w', edgecolor='black', linestyle = 'dashed')
plt.show()

Tips:由于在条形图、饼图等图形中,默认的边线的颜色为白色,因此若要在白色背景上进行显示,需要通过edgecolor参数改变边线颜色。

线宽

使用linewidth参数可以修改线条的粗细。默认情况下,linewidth设置为1个单位。利用线条的粗细可以在视觉上强调某条特定的曲线。

import numpy as np
import matplotlib.pyplot as plt
def gaussian(x, mu, sigma):a = 1. / (sigma * np.sqrt(2. * np.pi))b = -1. / (2. * sigma ** 2)return a * np.exp(b * (x - mu) ** 2)
x = np.linspace(-6, 6, 1024)
for i in range(64):samples = np.random.standard_normal(50)mu, sigma = np.mean(samples), np.std(samples)plt.plot(x, gaussian(x, mu, sigma), color = '.75', linewidth = .5)
plt.plot(x, gaussian(x, 0., 1.), color = 'c', linewidth = 3.)
plt.show()

控制填充样式

matplotlib提供了填充图案用于填充平面。这些填充图案,对于仅包含黑白两色的图形中具有重要作用。

import numpy as np
import matplotlib.pyplot as plt
n = 10
a = np.random.random(n)
b = np.random.random(n)
x = np.arange(n)
plt.bar(x, a, color='w', hatch='x', edgecolor='black')
plt.bar(x, a+b, bottom=a, color='w', edgecolor='black', hatch='/')
plt.show()


具有填充呈现性的函数(如pyplot.bar())接受可选参数hatch控制填充样式,此参数的可选值包括:"/", "\", "|", "-", "+", "x", "o", "O","."和"*",每个值对应于不同的填充图案;edgecolor参数可用于控制图案填充的颜色。

控制标记样式

在《详解常见统计图的绘制》中,我们已经了解了如何如何绘制曲线,并明白了曲线是由点之间的连线构成的;此外,散点图表示数据集中的每个点。而matplotlib提供了多种形状,可以用其他类型的标记替换点的样式。
标记的指定方式包括以下几种:

  1. 预定义标记:预定义的形状,表示为[0, 8]范围内的整数或某些预定义的字符串。
  2. 顶点列表:值对列表,用作形状路径的坐标。
  3. 正多边形:表示N边正多边形的三元组(N, 0, angle),其中angle为旋转角度。
  4. 星形多边形:它表示为三元组(N, 1, angle),代表N边正星形,其中angle为旋转角度。
import numpy as np
import matplotlib.pyplot as plt
a = np.random.standard_normal((100, 2))
a += np.array((-1, -1))
b = np.random.standard_normal((100, 2))
b += np.array((1, 1))
plt.scatter(a[:,0], a[:,1], color = 'm', marker = 'x')
plt.scatter(b[:,0], b[:,1], color = 'c', marker = '^')
plt.show()

使用marker参数,可以为每个数据集合集合指定不同的标记。

我们已经在中学习了如何在散点图中为每个点定义不同的颜色,如果我们需要为每个点定义不同样式该怎么办呢?问题在于,与color参数不同,marker参数不接受标记样式列表作为输入。因此,我们不能实现plt.scatter()的单次调来显示具有不同标记的多个点集。解决方案是,将每种类型的数据点分隔置不同集合中,并为每个集合单独调用pyplot.scatter()调用:

import numpy as np
import matplotlib.pyplot as plt
label_list = (b'Iris-setosa',b'Iris-versicolor',b'Iris-virginica',
)
colors = ['c','y','m']
def read_label(label):return label_list.index(label)
data = np.loadtxt('iris.data', delimiter = ',', converters = { 4 : read_label })
marker_set = ('^', 'x', '.')
for i, marker in enumerate(marker_set):data_subset = np.asarray([x for x in data if x[4] == i])plt.scatter(data_subset[:,0], data_subset[:,1], color = colors[i], marker = marker)
plt.show()

对于pyplot.plot(),也可以使用相同的标记参数访问标记样式。当数据点密集时,每个点都使用标记进行显示将会导致图片混乱,因此matplotlib提供了markevery参数,允许每隔N个点显示一个标记:

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-6, 6, 1024)
y_1 = np.sinc(x)
y_2 = np.sinc(x) + 1
plt.plot(x, y_1, marker = 'x', color = '.75')
plt.plot(x, y_2, marker = 'o', color = 'k', markevery = 64)
plt.show()

控制标记大小

标记的大小可选参数s进行控制:

import numpy as np
import matplotlib.pyplot as plt
a = np.random.standard_normal((100, 2))
a += np.array((-1, -1))
b = np.random.standard_normal((100, 2))
b += np.array((1, 1))
plt.scatter(a[:,0], a[:,1], c = 'm', s = 100.)
plt.scatter(b[:,0], b[:,1], c = 'c', s = 25.)
plt.show()

Tips:标记的大小由plt.scatter()的参数s设置,但应注意它设置的是标记的表面积倍率而非半径。
plt.scatter()函数还可以接受列表作为s参数的输入,其表示每个点对应一个大小:

import numpy as np
import matplotlib.pyplot as plt
m = np.random.standard_normal((1000, 2))
r_list = np.sum(m ** 2, axis = 1)
plt.scatter(m[:, 0], m[:, 1], c = 'w', edgecolor='c', marker = 'o', s = 32. * r_list)
plt.show()

Tips:plt.plot()函数允许在markersize(或简写为ms)参数的帮助下更改标记的大小,但是此参数不接受列表作为输入。

创建自定义标记

虽然matplotlib提供了多种标记形状。但是在某些情况下我们可能仍然找不到适合具体需求的形状。例如,我们可能希望使用公司徽标等作为形状。
在matplotlib中,将形状描述为一条路径——一系列点的连接。因此,如果要定义我们自己的标记形状,必须提供一系列的点:

import numpy as np
import matplotlib.path as mpath
from matplotlib import pyplot as plt
shape_description = [( 1., 2., mpath.Path.MOVETO),( 1., 1., mpath.Path.LINETO),( 2., 1., mpath.Path.LINETO),( 2., -1., mpath.Path.LINETO),( 1., -1., mpath.Path.LINETO),( 1., -2., mpath.Path.LINETO),(-1., -2., mpath.Path.LINETO),(-1., -1., mpath.Path.LINETO),(-2., -1., mpath.Path.LINETO),(-2., 1., mpath.Path.LINETO),(-1., 1., mpath.Path.LINETO),(-1., 2., mpath.Path.LINETO),( 0., 0., mpath.Path.CLOSEPOLY),
]
u, v, codes = zip(*shape_description)
my_marker = mpath.Path(np.asarray((u, v)).T, codes)
data = np.random.rand(8, 8)
plt.scatter(data[:,0], data[:, 1], c = 'm', marker = my_marker, s = 75)
plt.show()

Tips:所有带有标记的图形的pyplot函数都有一个可选参数marker,其参数值可以是预定义的matplotlib标记,也可以是自定义的路径实例,路径对象在matplotlib.path模块中定义。

Path对象的构造函数将坐标列表和指令列表作为输入;每个坐标一条指令,使用一个列表将坐标和指令融合在一起,然后将坐标列表和指令传递给路径构造函数,如下所示:

u, v, codes = zip(*shape_description)
my_marker = mpath.Path(np.asarray((u, v)).T, codes)

形状是通过光标的移动来描述的:

  • MOVETO:此指令将光标移动到指定的坐标,并不画线。
  • LINETO:这将在光标当前点和目标点之间绘制直线,并将光标移动至目标点。
  • CLOSEPOLY:此指令仅用于关闭路径,每个形状都以这条指示结束。

理论上,任何形状都是可能的,我们只需要描述它的路径。单在实践中,如果想使用复杂的形状,最好可以提前进行转换工作。

总结——对标记进行更精细控制

通过上述介绍,我们可以对标记进行精细控制,如边缘颜色、内部颜色等。

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-6, 6, 1024)
y = np.sinc(x)
plt.plot(x, y,linewidth = 3.,color = 'm',markersize = 9,markeredgewidth = 1.5,markerfacecolor = 'y',markeredgecolor = 'c',marker = 'o',markevery = 64)
plt.show()

Tips:markeredgecolor、markerfacecolor和markeredgewidth参数分别用于控制标记的边颜色、内部颜色和线宽。所有可以使用标记的函数(如plt.plot())都接受这些可选参数。

系列链接

Python-Matplotlib可视化(1)——一文详解常见统计图的绘制
Python-Matplotlib可视化(2)——自定义颜色绘制精美统计图
Python-Matplotlib可视化(4)——添加注释让统计图通俗易懂
Python-Matplotlib可视化(5)——添加自定义形状绘制复杂图形
Python-Matplotlib可视化(6)——自定义坐标轴让统计图清晰易懂
Python-Matplotlib可视化(7)——多方面自定义统计图绘制
Python-Matplotlib可视化(8)——图形的输出与保存
Python-Matplotlib可视化(9)——精通更多实用图形的绘制
Python-Matplotlib可视化(10)——一文详解3D统计图的绘制

Python-Matplotlib可视化(3)——自定义样式绘制精美统计图相关推荐

  1. Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式)、使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等)

    Python matplotlib可视化:自定义轴标签格式化函数(在轴刻度上添加自定义的数值以及符号形式).使用自定义函数在Matplotlib中为坐标轴刻度添加自定义符号(例如,货币符号¥$等) 目 ...

  2. python使用matplotlib可视化、自定义设置坐标轴的范围、自定义设置主坐标轴刻度和次坐标轴刻度(ticks)、自定义坐标轴刻度的显示样式、自定义坐标轴刻度数值的颜色以及小数点位数

    python使用matplotlib可视化.自定义设置坐标轴的范围.自定义设置主坐标轴刻度和次坐标轴刻度(ticks).自定义坐标轴刻度的显示样式.自定义坐标轴刻度数值的颜色以及小数点位数 目录

  3. Python+matplotlib可视化自定义轴域大小和位置

    推荐图书: <Python可以这样学>,ISBN:9787302456469,董付国,清华大学出版社,第9次印刷 图书详情(京东): 董付国老师17本Python系列图书均提供配套教学资源 ...

  4. python使用matplotlib可视化、自定义Y轴轴标签刻度旋转的角度(customize degree rotating axis tick labels in matplotlib)

    python使用matplotlib可视化.自定义Y轴轴标签刻度旋转的角度(customize degree rotating axis tick labels in matplotlib y aix ...

  5. python使用matplotlib可视化、自定义移除Y轴指定轴刻度标签(removing specific axis ticks in matplotlib y axis)

    python使用matplotlib可视化.自定义移除Y轴指定轴刻度标签(removing specific axis ticks in matplotlib y axis) 目录 python使用m ...

  6. python使用matplotlib可视化、自定义设置Y轴刻度标签字体的大小( setting axis ticks size in matplotlib y axis)

    python使用matplotlib可视化.自定义设置Y轴刻度标签字体的大小( setting axis ticks size in matplotlib y axis) 目录

  7. python使用matplotlib可视化、自定义移除X轴指定轴刻度标签(removing specific axis ticks in matplotlib x axis)

    python使用matplotlib可视化.自定义移除X轴指定轴刻度标签(removing specific axis ticks in matplotlib x axis) 目录 python使用m ...

  8. Python matplotlib可视化:用Matplotlib的bar_label函数自定义条形图的数值标签、用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的中部)

    Python matplotlib可视化:用Matplotlib的bar_label函数自定义条形图的数值标签.用Matplotlib的bar_label函数为条形图添加数值标记(在每一个条形的中部) ...

  9. python使用matplotlib可视化、自定义设置X轴刻度标签字体的大小( setting axis ticks size in matplotlib x axis)

    python使用matplotlib可视化.自定义设置X轴刻度标签字体的大小( setting axis ticks size in matplotlib x axis) 目录

最新文章

  1. 如何正确的学习Blender-入门到精通课程
  2. 用Leangoo项目管理软件做技术支持
  3. 创业公司自曝「被谷歌封杀」,阻断一切访问,上诉只得到机器人回复
  4. tableau实战系列(三十)- 多细节层次(LOD) 计算产品销售周期延申表达式详解
  5. python ip动态代理_Scrapy 配置动态代理IP的实现
  6. 学习区块链,绕不过去的“拜占庭将军问题”!!这里正好有通俗易懂的解释
  7. 百度网盘小程序互转工具:wx2正式开源!
  8. SQL Service自定义数据类型
  9. sql对查询的一列结果进行去重
  10. word List37
  11. [html] html中p标签内为何不能嵌套div标签?
  12. css禁止鼠标复制文本的属性:user-select
  13. matlab简单分析离散小波变换
  14. HTML5+CSS把footer固定在底部
  15. MySQL中varchar,varbinary的区别
  16. 路径规划算法:动态规划
  17. 服务器u盘pe制作,u盘winpe启动盘制作
  18. 不用ps如何批量修改图片尺寸?教你一个方法
  19. 关于流程图的场景提炼,这一次终于说清楚业务流程图、功能流程图、页面流程图了
  20. 解决 Vue3.0 globalThis is note defined

热门文章

  1. textarea的不可拉伸和不可编辑
  2. [转]oracle分页用两层循环还是三层循环?
  3. java泛型 之 入门(interface)
  4. spring 连数据库的配置文件
  5. [转载] python set()集合快速比较两个列表内的元素是否一致
  6. [转载] Python性能优化技巧总结
  7. [转载] python画柱状图-Python绘制精美图表之双柱形图
  8. 与我们息息相关的internet服务(2)---WWW服务
  9. xamarin.android pullToRefresharp.Android下拉刷新样式、侧滑删除功能
  10. Windows 2008 R2 安装 Windows phone 7 开发环境