双轴图表中如何取消刻度标签颜色显示

3

我正在绘制一个带有两个y轴的双重图表。第二个轴ax2是通过twinx创建的。问题是通过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。


我不太清楚你在做什么...(你所说的“双重绘图”到底是指twinx/twiny、子图,还是其他什么?)你能否发布一些示例代码或问题的示例图像以及你期望发生的情况? - Joe Kington
抱歉描述不够清晰。我追踪到问题出在使用“twinx”,并简化了问题描述。同时添加了一张图形。 - Boffin
1个回答

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()

我的猜测是你的问题主要来自于混合引用不同的对象。 我猜想你的代码有点复杂,当你调用plt.yticks时,ax2不是当前轴。 你可以通过在调用yticks之前显式调用sca(ax2)(将当前轴设置为ax2)来测试这个想法,并查看是否改变了事情。 一般来说,最好坚持完全使用Matlab风格的状态机界面或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()

在此输入图片描述

对于旧版本的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()

忽略的 color= 标签问题只在显式设置标签字符串时发生(奇怪的是):yticks(arange(0.1,0.4,0.1), ['.1 ', '.2', '.3'], color='green')。设置的字符串有效,但颜色无效。如果您指定它,您的第一个最小示例是否也有效?例如:plt.yticks([-4, -3, -2, -1, 0, 1], ['foo', 'bar'], color='green')。感谢指出不同的 matplotlib 风格(matlab vs. oo)。我会再多了解一下,以提高代码的一致性。 - Boffin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接