двойная метка убивает цвет метки - PullRequest
3 голосов
/ 15 октября 2011

Я строю двойной график с двумя осями Y. Вторая ось ax2 создается twinx. Проблема в том, что раскраска второй оси Y через yticks больше не работает. Вместо этого я должен set_color этикетки по отдельности. Вот соответствующий код:

fig = plt.figure()
fill_between(data[:,0], 0, (data[:,2]), color='yellow')
yticks(arange(0.2,1.2,0.2), ['.2', '.4', '.6', '.8', ' 1'], color='yellow')
ax2 = twinx()
ax2.plot(data[:,0], (data[:,1]), 'green')
yticks(arange(0.1,0.6,0.1), ['.1 ', '.2', '.3', '.4', '.5'], color='green')
# color='green' has no effect here ?!
# instead this is needed:
for t in ax2.yaxis.get_ticklabels(): t.set_color('green')
show()

В результате:

colored_ticklabels

Эта проблема возникает только в том случае, если я установил галочки.

yticks(arange(0.1,0.6,0.1), ['.1 ', '.2', '.3', '.4', '.5'], color='green')

Опустить это, как здесь

yticks(arange(0.1,0.6,0.1), color='green')

и окраска работает отлично.

Это ошибка (не удалось найти отчеты по этому вопросу), функция (?!) Или я что-то здесь упускаю? Я использую Python 2.6.5 с Matplotlib 0.99.1.1 на Ubuntu.

1 Ответ

2 голосов
/ 17 октября 2011

Во что бы то ни стало, ваш код отлично работает в моей системе, даже без цикла for для установки цветов надписей. В качестве справки, вот отдельный пример, который пытается в точности следовать тому, что вы опубликовали:

import matplotlib.pyplot as plt
import numpy as np

# Generate some data
num = 200
x = np.linspace(501, 1200, num)
yellow_data, green_data = np.random.random((2,num))
green_data -= np.linspace(0, 3, yellow_data.size)

# Plot the yellow data
plt.fill_between(x, yellow_data, 0, color='yellow')
plt.yticks([0.0, 0.5, 1.0], color='yellow')

# Plot the green data
ax2 = plt.twinx()
ax2.plot(x, green_data, 'g-')
plt.yticks([-4, -3, -2, -1, 0, 1], color='green')

plt.show()

enter image description here

Я предполагаю, что ваша проблема в основном связана со смешением ссылок на разные объекты. Я предполагаю, что ваш код немного сложнее, и что когда вы вызываете plt.yticks, ax2 не является текущей осью. Вы можете проверить эту идею, явно вызвав sca(ax2) (установите текущую ось на ax2) перед вызовом yticks и посмотрите, что изменится.

Вообще говоря, лучше придерживаться либо полностью интерфейса конечного автомата matlab-ish, либо интерфейса OO, и не слишком смешивать их. (Лично я предпочитаю просто придерживаться интерфейса ОО. Используйте pyplot для настройки объектов фигур и show, а в противном случае используйте методы осей. Каждому свой, хотя.)

Во всяком случае, при matplotlib> = 1.0 функция tick_params делает это немного более удобным. (Я также использую plt.subplots здесь, что также только в> = 1.0.)

import matplotlib.pyplot as plt
import numpy as np

# Generate some data
yellow_data, green_data = np.random.random((2,2000))
yellow_data += np.linspace(0, 3, yellow_data.size)
green_data -= np.linspace(0, 3, yellow_data.size)

# Plot the data
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

ax1.plot(yellow_data, 'y-')
ax2.plot(green_data, 'g-')

# Change the axis colors...
ax1.tick_params(axis='y', labelcolor='yellow')
ax2.tick_params(axis='y', labelcolor='green')

plt.show()

enter image description here

Эквивалентный код для более старых версий matplotlib будет выглядеть примерно так:

import matplotlib.pyplot as plt
import numpy as np

# Generate some data
yellow_data, green_data = np.random.random((2,2000))
yellow_data += np.linspace(0, 3, yellow_data.size)
green_data -= np.linspace(0, 3, yellow_data.size)

# Plot the data
fig = plt.figure()
ax1 = fig.add_subplot(1,1,1)
ax2 = ax1.twinx()

ax1.plot(yellow_data, 'y-')
ax2.plot(green_data, 'g-')

# Change the axis colors...
for ax, color in zip([ax1, ax2], ['yellow', 'green']):
    for label in ax.yaxis.get_ticklabels():
        label.set_color(color)

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...