Matplotlib对数刻度y轴
参考:matplotlib log scale y axis
Matplotlib是一个用于绘制数据可视化的Python库,它提供了丰富的功能用于创建各种类型的图形。在本文中,我们将重点介绍如何在Matplotlib中设置y轴的对数刻度。对数刻度在处理一些数据范围很大或波动很大的数据时非常有用,能够更直观地显示数据的趋势和分布。
设置y轴为对数刻度
在Matplotlib中,要将y轴设置为对数刻度可以使用semilogy
函数。这个函数可以绘制出y轴为对数刻度的图形,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.semilogy(x, y)
plt.show()
Output:
上面的示例代码中,我们使用semilogy
函数将y轴设置为对数刻度,并绘制了指数函数的图形。
设置对数刻度的范围
有时候我们希望对数刻度的范围不是默认的全局范围,而是我们手动指定的范围。可以使用set_ylim
函数来设置y轴的范围,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.semilogy(x, y)
plt.ylim(10, 1000)
plt.show()
Output:
在上面的示例中,我们使用set_ylim
函数将y轴的范围设置为10到1000,这样我们可以更清晰地看到数据在这个范围内的分布情况。
设置对数刻度的基数
默认情况下,Matplotlib会将y轴的对数刻度基数设置为10。有时候我们希望将基数设置为其他值,比如2或e。可以使用plt.yscale('log', base=2)
来设置对数刻度的基数,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.plot(x, y)
plt.yscale('log', base=2)
plt.show()
Output:
在上面的示例中,我们将对数刻度的基数设置为2,这样y轴的刻度将以2为基数递增。
嵌套对数刻度
有时候我们希望在一张图中同时使用线性刻度和对数刻度。可以通过设置双轴来实现这个效果,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
fig, ax1 = plt.subplots()
color = 'tab:red'
ax1.set_xlabel('x')
ax1.set_ylabel('linear scale', color=color)
ax1.plot(x, y, color=color)
ax1.tick_params(axis='y', labelcolor=color)
ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('log scale', color=color)
ax2.semilogy(x, y, color=color)
ax2.tick_params(axis='y', labelcolor=color)
plt.show()
Output:
在上面的示例中,我们创建了两个轴,一个使用线性刻度,一个使用对数刻度,这样就可以在同一张图中显示不同刻度类型的数据。
对数刻度的刻度标签
有时候我们希望设置对数刻度的刻度标签为特定的格式,比如科学计数法。可以使用LogFormatterSciNotation
来实现这个效果,示例如下:
from matplotlib.ticker import LogFormatterSciNotation
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.plot(x, y)
plt.yscale('log')
plt.gca().yaxis.set_major_formatter(LogFormatterSciNotation())
plt.show()
Output:
在上面的示例中,我们使用LogFormatterSciNotation
来设置对数刻度的刻度标签为科学计数法,这样更容易阅读和理解数据。
对数刻度的网格线
默认情况下,对数刻度的网格线不是等比例显示的,这样在二维散点图中会出现一些奇怪的效果。可以使用matplotlib.ticker.LogLocator
和matplotlib.ticker.LogFormatter
来设置对数刻度的网格线,示例如下:
from matplotlib.ticker import LogLocator, LogFormatter
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.plot(x, y, 'o')
plt.gca().yaxis.set_major_locator(LogLocator(base=10.0))
plt.gca().yaxis.set_major_formatter(LogFormatter(base=10.0))
plt.grid(True, which="both", linestyle="--")
plt.show()
Output:
在上面的示例中,我们使用LogLocator
和LogFormatter
来设置对数刻度的网格线,这样可以更好地展示数据的分布情况。
自定义对数刻度标签
有时候我们希望自定义对数刻度的标签,比如将对数刻度的数值显示为幂,可以通过重写LogFormatter
的_num_to_string
方法来实现,示例如下:
from matplotlib.ticker import LogFormatter
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
class CustomLogFormatter(LogFormatter):
def _num_to_string(self, x, vmin, vmax):
return f'10^{int(np.log10(x))}'
plt.figure()
plt.plot(x, y)
plt.yscale('log')
plt.gca().yaxis.set_major_formatter(CustomLogFormatter())
plt.show()
Output:
在上面的示例中,我们定义了一个CustomLogFormatter
类,重写了_num_to_string
方法将对数刻度的数值显示为10的幂次,这样可以更清晰地表示数据。
对数刻度的次要网格线
除了主要网格线外,有时候我们希望在对数刻度中显示次要网格线,可以通过设置次要网格线的格式来实现,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.plot(x, y)
plt.yscale('log')
plt.gca().yaxis.set_major_locator(LogLocator(base=10.0))
plt.gca().yaxis.set_major_formatter(LogFormatter(base=10.0))
plt.gca().yaxis.set_minor_locator(LogLocator(base=10.0, subs=[2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]))
plt.grid(True, which="both", linestyle="--")
plt.show()
在上面的示例中,我们设置了对数刻度的次要网格线格式,这样可以更清晰地显示数据的分布情况。
同时设置x轴和y轴为对数刻度
有时候我们希望同时设置x轴和y轴为对数刻度,可以通过semilogy
和semilogx
函数来实现,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.semilogy(x, y)
plt.semilogx(x, y**2)
plt.show()
Output:
在上面的示例中,我们同时将x轴和y轴设置为对数刻度,这样可以更好地显示数据的变化趋势。
对数刻度的逆向显示
有时候我们希望对数刻度的显示方向是逆向的,即从大到小显示。可以通过设置plt.gca().invert_yaxis()
来实现,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.plot(x, y)
plt.yscale('log')
plt.gca().invert_yaxis()
plt.show()
Output:
在上面的示例中,我们使用invert_yaxis()
函数将对数刻度的显示方向设置为逆向,这样y轴的刻度将从大到小显示。
对数刻度的标签旋转
有时候对数刻度的标签过长,会导致重叠现象。可以通过设置标签的旋转角度来解决这个问题,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.plot(x, y)
plt.yscale('log')
plt.gca().yaxis.set_tick_params(rotation=45)
plt.show()
Output:
在上面的示例中,我们将对数刻度的标签旋转45度,这样更容易阅读和理解数据。
对数刻度中显示特定刻度
有时候我们希望对数刻度中只显示特定的刻度,比如只显示整数刻度。可以通过设置matplotlib.ticker.MultipleLocator
来实现,示例如下:
from matplotlib.ticker import MultipleLocator
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.plot(x, y)
plt.yscale('log')
plt.gca().yaxis.set_major_locator(MultipleLocator(1))
plt.show()
在上面的示例中,我们使用MultipleLocator
指定对数刻度中只显示整数刻度,这样可以更清晰地展示数据。
对数刻度的对数变换
有时候我们希望对数刻度中的数据进行对数变换,即对数刻度上的数据进行取对数操作。可以通过设置func
参数来实现,示例如下:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0.1, 10, 100)
y = np.exp(x)
plt.figure()
plt.plot(x, y)
plt.gca().yaxis.set_major_formatter(LogFormatter(labelOnlyBase=False))
plt.gca().yaxis.set_label_coords(-0.1, 0.5)
plt.show()
在上面的示例中,我们使用LogFormatter(labelOnlyBase=False)
来对对数刻度上的数据进行对数变换,这样可以更好地展示数据的变化趋势。
通过本文的介绍,我们学习了如何在Matplotlib中设置y轴为对数刻度,以及一些对数刻度的高级用法和定制化操作。对数刻度在处理特定类型的数据时非常有用,能够更直观地展示数据的特征和趋势。