python办公自动化 --- 可视化


使用python的matplotlib库

可以画出高质量的二维图

matplotlib库画出来的图形

看上去非常美观、有质感

但是有时X轴数据比较多

而图形的显示宽度最大也就是屏幕的宽度

无法显示出来所有的X轴刻度值

或者显示出来的刻度值非常拥挤

无法看的清楚

那么,有没有办法解决呢?

其实,我们可以将关键的X轴数据显示出来

不重要的X轴数据不显示!


认识X轴数据和x轴刻度值


>>> import matplotlib.pyplot as plt

>>> y = [1,4,10,15,25,30]

>>> plt.plot(y)

>>> plt.show()

如果只使用Y轴的数据进行画图,那么函数plot()会默认X轴的数据是Y轴序列数据的索引值,即X轴数据从0开始对应Y轴的第1个值,1对应Y轴的第2个值,以此类推。见下图,X轴的数据或X轴的刻度,就是Y轴序列的索引。

我们再看另一种情况:

>>> x = [1,2,3,6,7,8]

这里X轴的数据是不连续的,中间缺了4和5

>>> y = [10,4,6,15,25,30]

>>> plt.plot(x,y,marker='x')

>>> plt.show()

见下图,尽管我们的X轴数据是不连续的,但是X轴的刻度值是连续的。也就是X轴刻度值会将x数据进行连续化,连续化之后作为X轴的刻度值。

我们再看一种情况:

>>> import numpy as np

>>> x = np.random.rand(10).round(3)

>>> x

array([0.033, 0.094, 0.999, 0.239, 0.152, 0.838, 0.911, 0.234, 0.17 ,0.349])

>>> y = np.random.randint(20,size=10)

>>> y

array([10, 13, 5, 1, 6, 15, 7, 14, 12, 19])

>>> plt.scatter(x,y)

>>> plt.show()

见下图,X轴刻度值将x数据进行均等化,每段间隔相等的距离,然后在X轴上显示出刻度值,此时刻度值就不一定是x数据了。因为x数据可能在间隔的中间,而不是在突出的刻度上,即刻度0.0、0.2、0.4、0.6、0.8、1.0,比如x的数据0.094就在刻度值0.0与刻度值0.2的中间。

我们再看一种情况:

>>> y = np.random.randint(20,size=5)

>>> y

array([ 3, 10, 6, 3, 18])

>>> x = list('cdeab')

>>> x

['c', 'd', 'e', 'a', 'b']

>>> plt.scatter(x,y)

>>> plt.show()

见下图,X轴的刻度值就是x的数据,即X轴刻度值与x数据一一对应。X轴刻度值的顺序与x数据的顺序是一致的,即x是c d e a b,那么x轴刻度值也是c d e a b。

我们再看一种情况:

>>> x

array(['ABW', 'ADO', 'AFG', 'AGO', 'ALB', 'ARE', 'ARG', 'ARM', 'ASM',

'ATG', 'AUS', 'AUT', 'AZE', 'BDI', 'BEL', 'BEN', 'BFA', 'BGD',

'BGR', 'BHR'], dtype=object)

>>> y = np.random.randint(10,size=20)

>>> plt.scatter(x,y)

>>> plt.show()

见下图,x数据是字符串类型,X轴刻度值也与x数据是一一对应的,但是,我们看到由于x数据较多,使得X轴刻度值也较多,由于在X轴上显示的字符空间是有限的,使得X轴看上去很拥挤或密集,效果不太好。

在x数据较多时,我们有时可以让重要的x数据显示出来,其它数据不显示,也就是只显示部分的x轴刻度值,其它空着不显示。

只显示部分X轴刻度值

>>> x

array(['ABW', 'ADO', 'AFG', 'AGO', 'ALB', 'ARE', 'ARG', 'ARM', 'ASM',

'ATG', 'AUS', 'AUT', 'AZE', 'BDI', 'BEL', 'BEN', 'BFA', 'BGD',

'BGR', 'BHR'], dtype=object)

>>> x2 = [s if s in ['AFG','ARM','BDI','BGD'] else '' for s in x]

我们只想让x数据中的['AFG','ARM','BDI','BGD']这些数据显示出来。

>>> x2

['', '', 'AFG', '', '', '', '', 'ARM', '', '', '', '', '', 'BDI', '', '', '', 'BGD', '', '']

>>> plt.scatter(x,y)

>>> plt.xticks(x,x2)

这行代码,是将本来以x数据作为x轴刻度值来显示,更改为以x2的数据作为x轴的刻度值来显示,其中,不显示的数据,x2是空字符串。

>>> plt.show()

见下图,我们看到x轴刻度值只显示了指定的字符串,其它字符串没显示。

我们再看x数据是数字的情况:

>>> y

array([9, 4, 1, 6, 1, 2, 7, 4, 4, 2, 6, 6, 8, 6, 3, 9, 2, 8, 9, 4])

>>> x = np.arange(20)

>>> x2 = [str(s) if s%3==0 else '' for s in x]

注意:这里一定要将x数字转换为字符串格式。

>>> x2

['0', '', '', '3', '', '', '6', '', '', '9', '', '', '12', '', '', '15', '', '', '18', '']

>>> plt.scatter(x,y)

>>> plt.xticks(x,x2)

总结


除了以上只显示x轴的部分刻度值

其实,在现实情况下,

我们还有其它许多关于X轴的显示需求

比如,垂直显示刻度值,

缩小显示x轴部分刻度(x数据极小和极大情况),

等等!

更多python办公自动化案例和经验

请继续关注我们的公众号和头条号

后期会持续进行更新

“白领服务工作室”的系列视频课如下:

Python办公自动化---Python入门课程

Python办公自动化---Python进阶课程

Python办公自动化---正则表达式

Python办公自动化---数据分析

Python办公自动化---网络爬虫

Python办公自动化---Excel表格专栏

Python办公自动化---Pdf专栏

Python办公自动化---Word专栏

Python办公自动化---图像专栏

Excel/WPS表格 --- 数据处理

如需学习以上视频课程,敬请留言!

作者 | 小白

来源 | 原创

编辑 | 白领服务工作室