форматная метка на оси y [дубликат]

Члены класса:

Для деструктора pure virtual требуется реализация.

Объявление деструктора по-прежнему требует от вас определения (в отличие от обычной функции):

struct X
{
    virtual ~X() = 0;
};
struct Y : X
{
    ~Y() {}
};
int main()
{
    Y y;
}
//X::~X(){} //uncomment this line for successful definition

Это происходит потому, что деструкторы базового класса вызывается, когда объект уничтожается неявно, поэтому требуется определение.

virtual методы должны быть реализованы или определены как чистые.

Это похоже на методы не virtual без определения, с добавлением аргументов, которые генерирует чистая декларация dummy vtable, и вы можете получить ошибку компоновщика без использования функции:

struct X
{
    virtual void foo();
};
struct Y : X
{
   void foo() {}
};
int main()
{
   Y y; //linker error although there was no call to X::foo
}

Чтобы это сработало, объявите X::foo() чистым:

struct X
{
    virtual void foo() = 0;
};

Non- virtual

Некоторые члены должны быть определены, даже если они явно не используются:

struct A
{ 
    ~A();
};

Следующие ошибки приведут к ошибке:

A a;      //destructor undefined

Реализация может быть встроенной в самом определении класса:

struct A
{ 
    ~A() {}
};

или снаружи:

A::~A() {}

Если реализация вне определения класса, но в заголовке, методы должны быть отмечены как inline, чтобы предотвратить множественное определение.

Все используемые методы-члены должны быть определены, если они используются.

Общей ошибкой является отказ от квалификации имени:

struct A
{
   void foo();
};

void foo() {}

int main()
{
   A a;
   a.foo();
}

Определение должно быть

void A::foo() {}

static. Члены данных должны быть определены вне класса в единственная единица перевода:

struct X
{
    static int x;
};
int main()
{
    int x = X::x;
}
//int X::x; //uncomment this line to define X::x

Инициализатор может быть предоставлен для элемента данных static const типа интеграла или перечисления в определении класса; однако odr-использование этого элемента по-прежнему потребует определения области пространства имен, как описано выше. C ++ 11 позволяет инициализировать внутри класса для всех членов static const данных.

26
задан tacaswell 16 August 2013 в 17:21
поделиться

2 ответа

Существует несколько способов сделать это

. Вы можете просто настроить пределы мощности (doc)

ax1.xaxis.get_major_formatter().set_powerlimits((0, 1))

, которые задают мощности где ScalerFormatter переключается на научную нотацию

Или вы можете использовать FuncFormatter, который дает вам большой контроль (но вы можете выбить свою ногу).

from matplotlib import ticker

scale_pow = 2
def my_formatter_fun(x, p):
    return "%.2f" % (x * (10 ** scale_pow))
ax1.get_xaxis().set_major_formatter(ticker.FuncFormatter(my_formatter_fun))
ax1.set_xlabel('my label ' + '$10^{{{0:d}}}$'.format(scale_pow))

FuncFormatter (doc) принимает функцию 2 аргументов, которая возвращает строку и использует эту функцию для форматирования метки. (Имейте в виду, это также изменит, как значения отображаются в углу интерактивных фигур). Второй аргумент - это «позиция», которая является аргументом, переданным, когда форматирование создает метки. Вы можете смело игнорировать его, но вы должны принять его (иначе вы получите ошибки от неправильного количества аргументов). Это является следствием унифицированного API всех форматировщиков и использования форматирования для отображения местоположения мыши в интерактивном режиме.

24
ответ дан tacaswell 26 August 2018 в 04:18
поделиться

Вы также должны указать ограничения по осям и порогу:

ax1.ticklabel_format(axis='y', style='sci', scilimits=(-2,2))

Это использовало бы формат sci на оси y , если цифры не соответствуют границам [0.01, 99].

34
ответ дан Adobe 26 August 2018 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: