Matplotlib Xticklabels не работает - PullRequest
0 голосов
/ 14 июня 2011

1.X-ticklabels не работает

Я использую Matplotlib для создания гистограммы из некоторых измерений:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as pyplot
...
fig = pyplot.figure()
ax = fig.add_subplot(1,1,1,)
n, bins, patches = ax.hist(measurements, bins=50, range=(graph_minimum, graph_maximum), histtype='bar')

ax.set_xticklabels([n], rotation='vertical')


for patch in patches:
    patch.set_facecolor('r')

pyplot.title='Foobar'
#pyplot.grid(True)
pyplot.xlabel('X-Axis')
pyplot.ylabel('Y-Axis')
pyplot.savefig(output_filename)

Полученный PNG выглядит хорошо, за исключением двух проблем:

  1. Название («Спам и Хэм») отсутствует в PNG.Обе метки x и y присутствуют (хотя я не включил их для приведенного ниже примера).
  2. Кажется, что метки x-tick-lable полностью разбиты - вместо того, чтобы показывать внизу под всемибары, он отображается в виде одной строки чисел под нижней левой части графика, который обрезается.Кажется, он также отключил мою метку оси Y.

Histogram with broken xticklabels

2.Префиксы единиц измерения и СИ

Примечание: не зависит от Matplotlib.

Гистограмма имеет измерения времени вдоль оси x.Они варьируются от микросекундного диапазона до миллисекунды и второго диапазона.На данный момент график отображает метки оси X в виде секунд в стандартной записи.

Time in seconds along x-axis

Я хотел бы в дружественном формате, я бы предпочел, чтобы было уделено времяв миллисекундах / микросекундах, с указанием единиц измерения.Таким образом, это означает, что я хотел бы что-то дружественно отформатировать значение времени с учетом префиксов SI.

На самом деле, это, вероятно, очень похоже на пример программы здесь:

http://diveintopython3.org/your-first-python-program.html

Я заметил, что есть некоторые библиотеки Python, которые обрабатывают единицы:

  1. http://juanreyero.com/open/magnitude/index.html
  2. http://home.scarlet.be/be052320/Unum.html
  3. http://pypi.python.org/pypi/units/

Однако из того, что я прочитал, похоже, что ни один из вышеперечисленных не обрабатывает префиксы SI и не выполняет такого рода дружественное форматирование.Любые предложения / альтернативы?

Ответы [ 2 ]

3 голосов
/ 14 июня 2011

1.1: в PNG отсутствует заголовок («Спам и Хэм»).

Вы написали

pyplot.title='Foobar'

Вы хотите

pyplot.title("Spam and Ham")

pyplot.title = 'Foobar' просто заменяет функцию заголовка строкой.

1.2: x-tick-lables кажется полностью неработающим

ISTMax.set_xticklabels([n], rotation='vertical') вероятно, это не то, что вы хотите сделать, потому что я не думаю, что это то, что вы думаете.Для измерений [1,2,3,4], мы получаем:

>>> n, bins, patches = ax.hist([1,2,3,4])
>>> n
array([1, 0, 0, 1, 0, 0, 1, 0, 0, 1])
>>> bins
array([ 1. ,  1.3,  1.6,  1.9,  2.2,  2.5,  2.8,  3.1,  3.4,  3.7,  4. ])
>>> patches
<a list of 10 Patch objects>

n - массив, содержащий счетчики в ячейках, а не в ячейках;это ось у, а не х.Более того, это уже список, поэтому использование [n] в любом случае не должно было быть необходимым.Я не уверен, что вы хотите сделать, но вы можете сделать строковые метки из корзин (если вы не хотите много цифр!) Или, если вы только хотите, чтобы метки xtick были вертикальными, вы можете использовать

for label in ax.get_xticklabels():
    label.set_rotation('vertical')

Боюсь, я ничего не знаю о библиотеках модулей.

0 голосов
/ 16 июля 2017

Чтобы добавить префиксы SI к меткам осей, которые вы хотите использовать QuantiPhy .Фактически, в его документации есть пример, который показывает, как это сделать: Пример MatPlotLib .

Я думаю, вы бы добавили что-то подобное в свой код:

from matplotlib.ticker import FuncFormatter
from quantiphy import Quantity

time_fmtr = FuncFormatter(lambda v, p: Quantity(v, 's').render(prec=2))
ax.xaxis.set_major_formatter(time_fmtr)
...