当前位置 : 主页 > 编程语言 > python >

Python-Matplotlib可视化(6)—

来源:互联网 收集:自由互联 发布时间:2022-06-18
也为副刻度添加辅助网格: import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as ticker x = np.linspace(-20, 20, 1024) y = np.sinc(x) ax = plt.axes() ax.xaxis.set_major_locator(ticker.MultipleLocator(5)) a

也为副刻度添加辅助网格:

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.ticker as ticker

x = np.linspace(-20, 20, 1024)

y = np.sinc(x)

ax = plt.axes()

ax.xaxis.set_major_locator(ticker.MultipleLocator(5))

ax.xaxis.set_minor_locator(ticker.MultipleLocator(1))

plt.grid(True, which='both', ls='dashed')

plt.plot(x, y, c = 'm')

plt.show()

为副刻度添加辅助网格Tips:我们已经知道,可以使用plt.grid()添加辅助网格,但此函数还有一个可选参数which,它具有三个可选值:"minor"、"major"和"both",分别用于仅显示副刻度、仅显示主刻度、主副刻度同时显示。

[](()控制刻度标签


是时候介绍刻度标签的设置了,刻度标签是图形空间中的坐标,虽然数字刻度标签对于大多说场景来说是足够的,但是却并不总是能够满足需求。例如,我们需要显示100个公司的营收情况,这时候我们就需要横坐标刻度标签为公司名,而非数字;同样对于时间序列,我们希望横坐标刻度标签为日期…。考虑到此类需求,我们需要使用Matplotlib为此提供了的API控制刻度标签。

可以按以下步骤为任何Matplotlib图形设置刻度标签:

import numpy as np

import matplotlib.ticker as ticker

import matplotlib.pyplot as plt

name_list = ('Apple', 'Orange', 'Banana', 'Pear', 'Mango')

value_list = np.random.randint(0, 99, size = len(name_list))

pos_list = np.arange(len(name_list))

ax = plt.axes()

ax.xaxis.set_major_locator(ticker.FixedLocator((pos_list)))

ax.xaxis.set_major_formatter(ticker.FixedFormatter((name_list)))

plt.bar(pos_list, value_list, color = 'c', align = 'center')

plt.show()

控制刻度标签

Tips:我们首先使用ticker.Locator实例来生成刻度的位置,然后使用ticker.Formatter实例将为刻度生成标签。FixedFormatter从字符串列表中获取标签,然后用Formatter实例设置坐标轴。同时,我们还使用了FixedLocator来确保每个标签中心都正好与刻度中间对齐。

[](()更简单的设置方式

虽然使用上述方法可以控制刻度标签,但可以看出此方法过于复杂,如果刻度标签是固定的字符列表,那么可以用以下简单的设置方法:

import numpy as np

import matplotlib.pyplot as plt

name_list = ('Apple', 'Orange', 'Banana', 'Pear', 'Mango')

value_list = np.random.randint(0, 99, size = len(name_list))

pos_list = np.arange(len(name_list))

plt.bar(pos_list, value_list, color = 'c', align = 'center')

plt.xticks(pos_list, name_list)

plt.show()

简单的设定坐标刻度标签的方法Tips:使用plt.xticks()函数为一组固定的刻度提供固定标签,此函数接受位置列表和名称列表作为参数值,可以看出,此方法比第一种方法实现起来更简单。

[](()高级刻度标签控制

不仅可以使用固定标签,使用ticker API可以使用函数生成的标签:

import numpy as np

import matplotlib.pyplot as plt

import matplotlib.ticker as ticker

def make_label(value, pos):

return '%0.1f%%' % (100. * value)

ax = plt.axes()

ax.xaxis.set_major_formatter(ticker.FuncFormatter(make_label))

x = np.linspace(0, 1, 256)

plt.plot(x, np.exp(-10 * x), c ='c')

plt.plot(x, np.exp(-5 * x), c= 'c', ls = '--')

plt.show()

高级刻度标签控制

在此示例中,刻度标签是由自定义函数make_label生成的。此函数以刻度的坐标作为输入,并返回一个字符串作为坐标标签,这比给出固定的字符串列表更灵活。为了使用自定义函数,需要使用FuncFormatter实例——一个以函数为参数的格式化实例。

这种将生成标签的实际任务指派给其他函数的方法称为委托(delegation)模式,这是一种漂亮的编程技术。比方说,我们要将每个刻度显示为日期,这可以使用标准的Python时间和日期函数完成:

import numpy as np

import datetime

import matplotlib.pyplot as plt

import matplotlib.ticker as ticker

start_date = datetime.datetime(1998, 1, 1)

def make_label(value, pos):

time = start_date + datetime.timedelta(days = 365 * value)

return time.strftime('%b %y')

ax = plt.axes()

ax.xaxis.set_major_formatter(ticker.FuncFormatter(make_label))

x = np.linspace(0, 1, 256)

plt.plot(x, np.exp(-10 * x), c ='c')

plt.plot(x, np.exp(-5 * x), c= 'c', ls = '--')

labels = ax.get_xticklabels()

plt.setp(labels, rotation = 30.)

plt.show()

委托模式示例

Tips:可以利用ax.get_xticklabels()获取刻度标签实例,然后对标签进行旋转,以避免长标签之间重叠,旋转使用plt.setp()函数,其接受刻度标签实例和旋转角度作为参数值。

[](()使用对数刻度


当可视化的数据变化范围非常广时,如果仍然使用常规的坐标轴刻度,将导致数据密集显示,甚至无法看到数据的变化趋势,这时,使用对数刻度就可以对图形进行更好的展示。

import numpy as np

import matplotlib.pyplot as plt

x = np.linspace(1, 10, 1024)

plt.yscale('log')

plt.plot(x, x, c = 'c', lw = 2., label = r'$f(x)=x$')

plt.plot(x, 10 ** x, c = 'y', ls = '--', lw = 2., label = r'$f(x)=e^x$')

plt.plot(x, np.log(x), c = 'm', lw = 2., label = r'$f(x)=\log(x)$')

plt.legend()

plt.show()

使用对数刻度

若使用常规坐标轴刻度,则图形将变得混乱:

常规坐标轴刻度,相同的图形却变得混乱

Tips:通过向plt.yscale()函数传递'log'参数值来得到对数刻度,;其他可用缩放类型参数值还包括'linear'、'symlog'等。同样,我们也可以使用plt.xscale()在x轴上获得相同的结果默认情况下,对数基数为10,但可以使用可选参数basex和basey进行更改。设置对数刻度适用于任何图形,而不仅仅是曲线图。

同样,使用对数标度也可以用于放大范围非常大的数据上的一个小范围:

import numpy as np

import matplotlib.pyplot as plt

x = np.linspace(-100, 100, 4096)

plt.xscale('symlog', linthreshx=6.)

plt.plot(x, np.sinc(x), c = 'c')

plt.show()

网友评论