plt線 - python plot三角形



matplotlib:將軸的偏移值格式化為整數或特定數字 (6)

你必須ScalarFormatter來做你所需要的... _set_offset只是添加一個常量,你想設置ScalarFormatter.orderOfMagnitude 。 不幸的是,手動設置orderOfMagnitude將不會執行任何操作,因為當調用ScalarFormatter實例來格式化軸刻度標籤時,它會重置。 它不應該是複雜的,但我找不到一個更簡單的方法去做你想要的東西......這裡有一個例子:

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

class FixedOrderFormatter(ScalarFormatter):
    """Formats axis ticks using scientific notation with a constant order of 
    magnitude"""
    def __init__(self, order_of_mag=0, useOffset=True, useMathText=False):
        self._order_of_mag = order_of_mag
        ScalarFormatter.__init__(self, useOffset=useOffset, 
                                 useMathText=useMathText)
    def _set_orderOfMagnitude(self, range):
        """Over-riding this to avoid having orderOfMagnitude reset elsewhere"""
        self.orderOfMagnitude = self._order_of_mag

# Generate some random data...
x = np.linspace(55478, 55486, 100) 
y = np.random.random(100) - 0.5
y = np.cumsum(y)
y -= y.min()
y *= 1e-8

# Plot the data...
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, 'b-')

# Force the y-axis ticks to use 1e-9 as a base exponent 
ax.yaxis.set_major_formatter(FixedOrderFormatter(-9))

# Make the x-axis ticks formatted to 0 decimal places
ax.xaxis.set_major_formatter(FormatStrFormatter('%0.0f'))
plt.show()

其產生如下所示:

而默認的格式將如下所示:

希望那有所幫助!

編輯:對於它的價值,我不知道偏移標籤所在的位置......只是手動設置它會稍微容易些,但我無法弄清楚如何去做......我感覺到必須有比這一切更簡單的方法。 它的工作,雖然!

我有一個matplotlib圖,我繪製的數據總是被稱為納秒(1e-9)。 在y軸上,如果我有數十納秒的數據,即。 44e-9,軸上的值顯示為4.4,其中a + 1e-8作為偏移量。 無論如何強迫軸顯示44 + 1e-9偏移?

這同樣適用於我的x軸,其中軸顯示+ 5.54478e4,我寧願顯示+55447的偏移量(整數,無小數 - 此處的值以天為單位)。

我已經嘗試了幾件這樣的事情:

p = axes.plot(x,y)
p.ticklabel_format(style='plain')

對於X軸,但這不起作用,儘管我可能錯誤地使用了它或錯誤地解釋了文檔中的某些內容,有人能指出我的方向是正確的嗎?

謝謝,喬納森

我嘗試過使用格式化程序,但還沒有找到任何解決方案...:

myyfmt = ScalarFormatter(useOffset=True)
myyfmt._set_offset(1e9)
axes.get_yaxis().set_major_formatter(myyfmt)

myxfmt = ScalarFormatter(useOffset=True)
myxfmt.set_portlimits((-9,5))
axes.get_xaxis().set_major_formatter(myxfmt)

在附註中,我實際上對'偏移號碼'對象實際存在的位置感到困惑......它是主要/次要蜱的一部分嗎?


Answer #1

對於第二部分,沒有再次手動重置所有的報價,這是我的解決方案:

class CustomScalarFormatter(ScalarFormatter):
    def format_data(self, value):
        if self._useLocale:
            s = locale.format_string('%1.2g', (value,))
        else:
            s = '%1.2g' % value
        s = self._formatSciNotation(s)
        return self.fix_minus(s)
xmajorformatter = CustomScalarFormatter()  # default useOffset=True
axes.get_xaxis().set_major_formatter(xmajorformatter)

顯然你可以將格式字符串設置為任何你想要的。


Answer #2

我認為更優雅的方式是使用股​​票格式化程序。 這裡是xaxis和yaxis的例子:

from pylab import *
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

majorLocator   = MultipleLocator(20)
xFormatter = FormatStrFormatter('%d')
yFormatter = FormatStrFormatter('%.2f')
minorLocator   = MultipleLocator(5)


t = arange(0.0, 100.0, 0.1)
s = sin(0.1*pi*t)*exp(-t*0.01)

ax = subplot(111)
plot(t,s)

ax.xaxis.set_major_locator(majorLocator)
ax.xaxis.set_major_formatter(xFormatter)
ax.yaxis.set_major_formatter(yFormatter)

#for the minor ticks, use no labels; default NullFormatter
ax.xaxis.set_minor_locator(minorLocator)

Answer #3

更簡單的解決方案是簡單地自定義刻度標籤。 以這個例子:

from pylab import *

# Generate some random data...
x = linspace(55478, 55486, 100)
y = random(100) - 0.5
y = cumsum(y)
y -= y.min()
y *= 1e-8

# plot
plot(x,y)

# xticks
locs,labels = xticks()
xticks(locs, map(lambda x: "%g" % x, locs))

# ytikcs
locs,labels = yticks()
yticks(locs, map(lambda x: "%.1f" % x, locs*1e9))
ylabel('microseconds (1E-9)')

show()

注意在y軸情況下,我將這些值乘以1e9然後在y標籤中提到該常數

編輯

另一種選擇是通過手動將文本添加到圖的頂部來偽造指數乘數:

locs,labels = yticks()
yticks(locs, map(lambda x: "%.1f" % x, locs*1e9))
text(0.0, 1.01, '1e-9', fontsize=10, transform = gca().transAxes)

EDIT2

您也可以用相同的方式格式化x軸偏移值:

locs,labels = xticks()
xticks(locs, map(lambda x: "%g" % x, locs-min(locs)))
text(0.92, -0.07, "+%g" % min(locs), fontsize=10, transform = gca().transAxes)


Answer #4

與Amro的答案類似,您可以使用FuncFormatter

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

# Generate some random data...
x = np.linspace(55478, 55486, 100) 
y = np.random.random(100) - 0.5
y = np.cumsum(y)
y -= y.min()
y *= 1e-8

# Plot the data...
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y, 'b-')

# Force the y-axis ticks to use 1e-9 as a base exponent 
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, pos: ('%.1f')%(x*1e9)))
ax.set_ylabel('microseconds (1E-9)')

# Make the x-axis ticks formatted to 0 decimal places
ax.xaxis.set_major_formatter(FuncFormatter(lambda x, pos: '%.0f'%x))
plt.show()

Answer #5

貢薩洛的解決方案在添加set_scientific(False)後開始為我工作:

ax=gca()
fmt=matplotlib.ticker.ScalarFormatter(useOffset=False)
fmt.set_scientific(False)
ax.xaxis.set_major_formatter(fmt)




matplotlib