我目前正在生成不同的数字,其中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()
我可以添加什么来强制绘制刻度线1.0,2.0等y轴上的 ?
答案 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()
以下是它的外观。
答案 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()
答案 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()