python / matplotlib Символы оси x перекрываются [дубликаты]

Я знаю, я опаздываю, но позвольте мне попытаться упростить его.

Скажем, существует функция

    function Foo(message){

         this.message = message ; 
     };

     console.log(Foo.prototype);

Функция Foo будет иметь связанный прототип объекта. Итак, всякий раз, когда мы создаем функцию в JavaScript, у нее всегда есть связанный с ней объект-прототип.

Теперь давайте продолжим и создадим два объекта, используя функцию Foo.

    var a = new Foo("a");
    var b = new Foo("b");
    console.log(a.message);
    console.log(b.message);
  1. Теперь у нас есть два объекта: объект a и объект b. Оба они создаются с использованием конструктора Foo. Имейте в виду, что конструктор - это просто слово.
  2. Объект a и b имеют копию свойства сообщения.
  3. Эти два объекта a и b связаны с прототипом объекта конструктора Foo.
  4. На объектах a и b, мы можем получить доступ к прототипу Foo, используя свойство proto во всех браузерах, а в IE мы можем использовать Object.getPrototypeOf (a) или Object.getPrototypeOf (b)

Теперь Foo.prototype , a.proto и b.proto все обозначает один и тот же объект.

    b.__proto__ === Object.getPrototypeOf(a);
    a.__proto__ ===  Foo.prototype;
    a.constructor.prototype  === a.__proto__;

все вышеизложенное вернет true.

Как известно, свойства JavaScript могут добавляться динамически. Мы можем добавить свойство к объекту

    Foo.prototype.Greet = function(){

         console.log(this.message);
    }
    a.Greet();//a
    b.Greet();//b
    a.constructor.prototype.Greet();//undefined 

Как вы видите, мы добавили метод Greet () в Foo.prototype, но он доступен в a и b или любом другом объекте, который построен с использованием Foo.

При выполнении функции a.Greet () JavaScript сначала будет искать Greet в объекте в списке свойств. Не найдя, он будет расти в прото-цепочке a. Поскольку a.proto и Foo.prototype - это один и тот же объект, JavaScript найдет метод Greet () и выполнит его.

Надеюсь, теперь прототип и прото упрощаются.

40
задан irl_irl 9 March 2012 в 03:47
поделиться

2 ответа

Как сказал @KyssTao, help(dates.num2date) говорит, что x должен быть float, дающим число дней с 0001-01-01 плюс один. Следовательно, 19910102 не 2 / янв / 1991, потому что, если вы посчитали 19910101 дней с 0001-01-01, вы получите что-то в год 54513 или подобное (разделите на 365,25, количество дней в году).

Вместо этого используйте datestr2num (см. help(dates.datestr2num)):

new_x = dates.datestr2num(date) # where date is '01/02/1991'
13
ответ дан mathematical.coffee 21 August 2018 в 14:37
поделиться

Вы можете сделать это более просто, используя plot() вместо plot_date().

Сначала преобразуем ваши строки в экземпляры Python datetime.date:

import datetime as dt

dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here

Затем сюжет:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()

Результат:

enter image description here [/g0]

87
ответ дан bernie 21 August 2018 в 14:37
поделиться
  • 1
    вы могли бы просто написать y = range (len (x)) – Kyss Tao 9 March 2012 в 04:43
  • 2
    Я просто знаю, что xrange () можно использовать, чтобы избежать создания списка; но здесь мы создаем список в любом случае – Kyss Tao 9 March 2012 в 05:40
  • 3
    Я только что сделал эксперимент по синхронизации с len (x), чтобы быть 10Mio. Я ожидал, что диапазон () и ваше понимание списка с помощью xrange () будут одинаковыми; но к моему удивлению диапазон () был еще быстрее! – Kyss Tao 9 March 2012 в 05:46
  • 4
    @bernie Спасибо, это действительно помогло мне. Однако в моей проблеме у меня слишком много дней, поэтому весь сюжет забит. Как показать каждый пятый день или каждый десятый день на оси х с помощью вашего метода? – user1506145 3 July 2013 в 09:26
  • 5
    К сожалению, это показывает мне не 3 даты, а 6 других дат (в этом интервале). Использование matplotlib-1.5.1 – Groosha 22 May 2016 в 09:16
Другие вопросы по тегам:

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