Как печатать только имена месяцев по оси х из временных рядов, используя matplotlib в python [duplicate]

Это вызвано функцией JVM и, если вы не делаете взломать, например, тот, который предоставлен Marcus A., на самом деле не так просто работать. [D0] .flush () работает в этом случае, но причина этого намного сложнее в работе.

Что здесь происходит?

JVM умный, но также очень, очень аутичный. Когда вы программируете на Java, вы не говорите компьютеру, что делать, вы сообщаете JVM (виртуальная машина Java), что вы хотели бы сделать. И он будет делать это, но более эффективно. Ваш код не является точным подробным инструкциям, в этом случае вам нужен только компилятор, как на C и C ++, JVM берет ваш код в качестве списка спецификаций для того, что он должен оптимизировать, а затем делать. Это то, что происходит здесь. Java видит, что вы нажимаете строки в два разных потока буферов. Самый эффективный способ сделать это - буферизировать все строки, которые вы хотите передать потокам, а затем вывести их. Это происходит по одному потоку в то время, по существу преобразуя ваш код, сделав что-то вроде этого (будьте осторожны: псевдокод) :

  for (int i = 0; i & lt;  5; i ++) {out.add ();  err.add ();  } out.flush ();  err.flush ();   

Поскольку это более эффективно, именно это будет делать JVM. Добавление .flush () в цикле будет сигнализировать JVM о необходимости промывки в каждом цикле, который не может быть улучшен с помощью вышеуказанного метода. Но если вы объясните, как это будет работать, цикл JVM изменит порядок вашего кода, чтобы сделать его последним, потому что это более эффективно.

  System.out  .println ( "из");  System.out.flush ();  System.err.println ( "ERR");  System.err.flush ();  System.out.println ( "из");  System.out.flush ();  System.err.println ( "ERR");  System.err.flush ();   

Этот код всегда будет реорганизован на что-то вроде этого:

  System.out.println («out»); * System.err.  println ("err"); * System.out.println ("out"); * System.err.println ("err"); * System.out.flush ();  System.err.flush ();   

Поскольку буферизация многих буферов только для их очистки сразу после того, как требуется намного больше времени, чем для буферизации всего буфера, а затем сбрасывает все это одновременно.

Как его решить

Здесь может возникнуть дизайн кода и архитектура; вы вроде бы не решаете этого. Чтобы обойти это, вы должны сделать его более эффективным для буферизации печати / флеша, печати буфера или флеша, чем буфер, а затем сброс. Это, скорее всего, соблазнит вас неудачным дизайном. Если для вас важно, как вывести его упорядоченно, я предлагаю вам попробовать другой подход. For-looping с .flush () - это один из способов взломать его, но вы все еще взламываете функцию JVM, чтобы повторно упорядочить и оптимизировать свой код для вас.

* Я не могу проверить, что буфер, который вы добавили в первую очередь, сначала будет печататься первым, но, скорее всего, будет.

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 16 August 2018 в 11:01
поделиться

Вы можете сделать это более просто, используя 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]

86
ответ дан bernie 16 August 2018 в 11:01
поделиться
  • 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
Другие вопросы по тегам:

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