在Matplotlib

时间:2017-02-09 16:38:56

标签: python matplotlib

我目前正在生成不同的数字,其中y轴的科学记数法导致某些地块上的2或6等蜱,但其他一些地方则为2.5或8.9。我想在y轴上总是有一个带小数的刻度,即使它加零。这是一个例子

import matplotlib.pyplot as plt
import numpy as np

plt.plot(np.arange(1, 10), np.arange(1, 10)**5)
ax = plt.gca()
plt.ticklabel_format(axis='y', style='sci')
ax.yaxis.major.formatter.set_powerlimits((0,0))
plt.show()

Figure generated

我可以添加什么来强制绘制刻度线1.0,2.0等y轴上的

3 个答案:

答案 0 :(得分:2)

ScalarFormatter目前不支持刻度线的自定义格式,例如设置小数位数。但是,您可以扩展该类,以强制它使用您指定的格式。这是一个例子:

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import ScalarFormatter

class ScalarFormatterForceFormat(ScalarFormatter):
    def _set_format(self):  # Override function that finds format to use.
        self.format = "%1.1f"  # Give format here

plt.plot(np.arange(1, 10), np.arange(1, 10)**5)
ax = plt.gca()
yfmt = ScalarFormatterForceFormat()
yfmt.set_powerlimits((0,0))
gca().yaxis.set_major_formatter(yfmt)
plt.show()

以下是它的外观。

enter image description here

答案 1 :(得分:1)

由于我没有设法使其他答案起作用,可能是因为我在使用子图和轴,所以我创建了一个函数来解决使用命令plt.ticklabel_format(axis='y', style='sci')的问题。

该函数采用y轴的粗标签并将值转换为科学计数法。它计算指数的值和正负号,然后使用ax.annotate将指数放置在左上角,从而相应地修改图。 该函数将需要修改的斧头作为参数,因此需要使用轴(ax)声明图形,并显示十进制数字。 唯一未知的是textsize中的annotate,它也可以自动执行。 我添加了两个不同的图来显示带有负数或小数的情况。

import matplotlib.pyplot as plt
import numpy as np


def scientific_notation_y(ax, decimals=1):
    v = np.asarray(ax.get_yticks().tolist())
    v_abs = np.abs(v)
    v_max = np.max(v_abs)
    exp = 0

    if v_max >= 10:
        sign = '+'
        while v_max >= 10:
            exp = exp + 1
            v_max = v_max / 10
        v = v / 10**exp
    elif v_max <= 1:
        sign = '-'
        while v_max <= 1:
            exp = exp + 1
            v_max = v_max * 10
        v = v * 10**exp
    v = np.around(v, decimals)
    ax.annotate(r'1e' + sign + str(exp), xycoords='axes fraction',
                xy=(0, 0), xytext=(0, 1.01), size=14)
    ax.set_yticklabels(v)
    return

fig, ax = plt.subplots()
ax.plot(np.arange(0, 10), np.arange(0, 10)**5)
scientific_notation_y(ax, 1)
plt.show()

fig, ax = plt.subplots()
ax.plot(np.arange(0, 10), -np.arange(0, 10)**5)
scientific_notation_y(ax, 1)
plt.show()

fig, ax = plt.subplots()
ax.plot(np.arange(0, 10), -np.arange(0, 10)/100)
scientific_notation_y(ax, 1)
plt.show()

enter image description here

答案 2 :(得分:0)

您可以按照自己的意愿获得标记和format

plt.plot(np.arange(1, 10), np.arange(1, 10)**5)
ax = plt.gca()
plt.ticklabel_format(axis='y', style='sci')
ax.yaxis.major.formatter.set_powerlimits((0,0))

xx, locs = plt.xticks()
ll = ['%.1f' % a for a in xx]
plt.xticks(xx, ll)
plt.show()

formating ticks