2011-10-15 50 views
2

我正在绘制一个带有两个y轴的双重绘图。第二轴ax2twinx创建。问题在于通过yticks的第二个Y轴着色不再起作用。相反,我必须单独使用set_color标签。下面是相关代码:twinx杀死勾号标签颜色

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。

+0

我不太清楚你在做什么......(你是指“双重情节”,“双胞胎”或“双胞胎”,子情节或其他什么东西?)你能举一些例子吗?代码或问题的示例图像和/或您期望发生的事情? –

+0

对不清楚的描述。我把这个问题追溯到使用'twinx'并压缩了问题描述。还添加了一个图形。 – Boffin

回答

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不是当前轴。在调用yticks之前,您可以通过明确调用sca(ax2)(将当前轴设置为ax2)来验证该想法,并查看是否改变了事情。

一般来说,最好坚持使用完全的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() 
+0

仅当我明确设置标签字符串时,才会出现(忽略)忽略'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与oo)。为了提高我的代码的一致性,我会再读一遍。 – Boffin