Элегантно изменяя цвет рамки сюжета в matplotlib - PullRequest
24 голосов
/ 15 октября 2011

Это своего рода дополнительный вопрос к этой записи, где обсуждалась раскраска топоров, галочек и меток. Я надеюсь, что это нормально, чтобы открыть новый, расширенный вопрос для этого.

Изменение цвета всей рамки (тики и оси) вокруг двойного графика (через add_subplot) с осями [ax1, ax2] приводит к большому количеству кода. Этот фрагмент изменяет цвет рамки верхнего графика :

ax1.spines['bottom'].set_color('green')
ax1.spines['top'].set_color('green')
ax1.spines['left'].set_color('green')
ax1.spines['right'].set_color('green')
for t in ax1.xaxis.get_ticklines(): t.set_color('green')
for t in ax1.yaxis.get_ticklines(): t.set_color('green')
for t in ax2.xaxis.get_ticklines(): t.set_color('green')
for t in ax2.yaxis.get_ticklines(): t.set_color('green')

Таким образом, для изменения цвета рамки двух графиков с двумя осями у каждого мне понадобится 16 (!) Строк кода ... Вот как это выглядит:

enter image description here

Другие методы, которые я выкопал до сих пор:

  • matplotlib.rc: обсуждается здесь ; меняется глобально, а не локально. Я хочу иметь несколько других сюжетов разных цветов. Пожалуйста, не обсуждайте слишком много цветов на графиках ...: -)

    matplotlib.rc('axes',edgecolor='green')
    
  • выкопать шипы оси, затем изменить ее: также обсуждается здесь ; не очень элегантно, я думаю.

    for child in ax.get_children():
        if isinstance(child, matplotlib.spines.Spine):
            child.set_color('#dddddd')
    

Есть ли элегантный способ уплотнения вышеуказанного блока, что-то больше "питоник"?

Я использую python 2.6.5 с matplotlib 0.99.1.1 под Ubuntu.

Ответы [ 3 ]

18 голосов
/ 30 октября 2011

Рефакторинг вашего кода выше:

import matplotlib.pyplot as plt

for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']):
    plt.setp(ax.spines.values(), color=color)
    plt.setp([ax.get_xticklines(), ax.get_yticklines()], color=color)
12 голосов
/ 16 октября 2011

Если вы используете достаточно актуальную версию matplotlib (> = 1.0), возможно, попробуйте что-то вроде этого:

import matplotlib.pyplot as plt

# Make the plot...
fig, axes = plt.subplots(nrows=2)
axes[0].plot(range(10), 'r-')
axes[1].plot(range(10), 'bo-')

# Set the borders to a given color...
for ax in axes:
    ax.tick_params(color='green', labelcolor='green')
    for spine in ax.spines.values():
        spine.set_edgecolor('green')

plt.show()

enter image description here

5 голосов
/ 23 октября 2011

Может быть, немного грубо ответить на мой собственный вопрос, но я хотел бы поделиться тем, что я смог найти до сих пор. Эта версия может раскрасить два вспомогательных участка с осями [ax1, ax2] и [ax3, ax4] в два разных цвета. Это намного короче, чем 16 строк, которые я изложил в моем вопросе выше. Он вдохновлен ответом Джо Кингтона здесь и в тикл-ярлыке с двумя пальцами убивает цвет .

import matplotlib.pyplot as plt
import numpy as np

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

fig = plt.figure()
plt.subplot(211) # Upper Plot
ax1 = fig.add_subplot(211)
ax1.fill_between(x, 0, yellow_data, color='yellow')
ax2 = ax1.twinx()
ax2.plot(x, green_data, 'green')
plt.setp(plt.gca(), xticklabels=[])
plt.subplot(212) # Lower Plot
ax3 = fig.add_subplot(212)
ax3.fill_between(x, 0, yellow_data, color='yellow')
ax4 = ax3.twinx()
ax4.plot(x, blue_data, 'blue')

# Start coloring
for ax, color in zip([ax1, ax2, ax3, ax4], ['green', 'green', 'blue', 'blue']):
    for ticks in ax.xaxis.get_ticklines() + ax.yaxis.get_ticklines():
        ticks.set_color(color)
    for pos in ['top', 'bottom', 'right', 'left']:
        ax.spines[pos].set_edgecolor(color)
# End coloring

plt.show()

color_plots

Я отметил это как принятое, так как это самое компактное решение, которое я мог найти до сих пор. Тем не менее, я открыт для других, может быть, более элегантных способов ее решения.

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