twinx杀死标签颜色

时间:2011-10-15 16:39:47

标签: python colors matplotlib

我正在绘制一个带有两个y轴的双重图。第二个轴ax2twinx创建。问题是通过yticks的第二个y轴的着色不再起作用。相反,我必须单独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')

着色效果很好。

  

这是一个错误(找不到任何报告),一个功能(?!)或   我在这里错过了什么吗?我在ubuntu上使用python 2.6.5和matplotlib 0.99.1.1。

1 个答案:

答案 0 :(得分:2)

无论它值多少,即使没有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界面,不要混淆太多。 (就个人而言,我更喜欢坚持使用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()