【问题标题】:twinx kills tick label colortwinx 杀死刻度标签颜色
【发布时间】:2011-12-08 09:55:44
【问题描述】:

我正在绘制一个带有两个 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()

导致:

仅当我设置刻度字符串时才会出现此问题。

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、子情节或其他什么?)您能否发布一些示例代码或问题的示例图像和/或您期望发生的情况?
  • 抱歉描述不清楚。我将问题追踪到twinx 的使用并浓缩了问题描述。还添加了一个图形。

标签: python colors matplotlib


【解决方案1】:

不管它值多少钱,即使没有 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-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()

旧版本 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 与 oo)。我会多读一点以提高代码的一致性。
猜你喜欢
  • 1970-01-01
  • 2016-06-14
  • 2020-02-18
  • 2018-10-06
  • 1970-01-01
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多