Строковые повторяющиеся строки с использованием matplotlib [duplicate]

Это фактически не имеет ничего общего с значениями по умолчанию, кроме того, что часто возникает неожиданное поведение при записи функций с изменяемыми значениями по умолчанию.

>>> def foo(a):
    a.append(5)
    print a

>>> a  = [5]
>>> foo(a)
[5, 5]
>>> foo(a)
[5, 5, 5]
>>> foo(a)
[5, 5, 5, 5]
>>> foo(a)
[5, 5, 5, 5, 5]

В этом нет значений по умолчанию код, но вы получаете точно такую ​​же проблему.

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

Ваш оригинал foo с аргументом по умолчанию не должен изменять a, был ли он явно передан или получил значение по умолчанию. Ваш код должен оставлять изменчивые аргументы отдельно, если из контекста / имени / документации не ясно, что аргументы должны быть изменены. Использование измененных значений, передаваемых в качестве аргументов, таких как локальные временные файлы, является крайне плохой идеей, независимо от того, находимся ли мы на Python или нет, и есть ли задействованные аргументы по умолчанию.

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

32
задан Sasha 26 September 2011 в 19:03
поделиться

4 ответа

Используйте команду xticks .

import matplotlib.pyplot as plt

t11 = ['00', '01', '02', '03', '04', '05', '10', '11', '12', '13', '14', '15',
       '20', '21', '22', '23', '24', '25', '30', '31', '32', '33', '34', '35',
       '40', '41', '42', '43', '44', '45', '50', '51', '52', '53', '54', '55']

t12 = [173, 135, 141, 148, 140, 149, 152, 178, 135, 96, 109, 164, 137, 152,
       172, 149, 93, 78, 116, 81, 149, 202, 172, 99, 134, 85, 104, 172, 177,
       150, 130, 131, 111, 99, 143, 194]


plt.bar(range(len(t12)), t12, align='center')
plt.xticks(range(len(t12)), t11, size='small')
plt.show()
54
ответ дан Stephen Terry 22 August 2018 в 03:07
поделиться
  • 1
    Почему вы использовали len(t12) в обеих строках? Разве нельзя быть len(t11)? – User 22 September 2016 в 01:31
  • 2
    @User Вообще-то да, ты прав. При вызове xticks вы обычно хотите, чтобы количество тиков было равно числу меток. В этом случае длина обоих списков одинакова, поэтому это не имеет большого значения. – hoffee 13 July 2018 в 17:05

Сначала вам нужно получить доступ к объекту оси:

fig, ax = plt.subplots(1,1)

, затем:

ax.set_yticks([x for x in range(-10,11)])
ax.set_yticklabels( ['{0:2d}'.format(abs(x)) for x in range(-10, 11)])
0
ответ дан Colin Dickie 22 August 2018 в 03:07
поделиться

В matplotlib lingo вы ищете способ установки пользовательских тиков.

Кажется, вы не можете достичь этого с помощью ярлыка pyplot.hist. Вам нужно будет создать свое изображение шаг за шагом. На Stack Overflow уже есть ответ на вопрос, который очень похож на ваш, и вы должны начать: Matplotlib - пометить каждый бит

3
ответ дан Community 22 August 2018 в 03:07
поделиться

Для объектно-ориентированного API matplotlib можно построить собственный текст на x-ticks файла axis со следующим кодом:

x = np.arange(2,10,2)
y = x.copy()
x_ticks_labels = ['jan','feb','mar','apr','may']

fig, ax = plt.subplots(1,1) 
ax.plot(x,y)

# Set number of ticks for x-axis
ax.set_xticks(x)
# Set ticks labels for x-axis
ax.set_xticklabels(x_ticks_labels, rotation='vertical', fontsize=18)

15
ответ дан David Alvarez 22 August 2018 в 03:07
поделиться
Другие вопросы по тегам:

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