Как изменить цвет осей графика matplotlib 3D?

1 Niriel [2012-02-09 20:14:00]

Я установил

import matplotlib as mpl
AXES_COLOR = '#333333'
mpl.rc('axes', edgecolor=AXES_COLOR, labelcolor=AXES_COLOR, grid=True)
mpl.rc('xtick', color=AXES_COLOR)
mpl.rc('ytick', color=AXES_COLOR)
mpl.rc('grid', color=AXES_COLOR)

Цвет меток осей и тиков правильно установлены как в 2D, так и в 3D. Однако edgecolor не применяется к трехмерным осям, и они остаются черными. Аналогично, сетка не влияет.

Я думаю, что понял, как получить доступ к отдельным осям 3D-графика:

import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d # Needed for 3d projection.
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.w_zaxis # <- the z axis

В документации упоминается свойство, которое мы можем использовать до тех пор, пока разработчики не закончили рефакторинг своего 3D-кода:

import pprint
pprint.pprint(ax.w_xaxis._AXINFO)

{'x': {'color': (0.95, 0.95, 0.95, 0.5),
       'i': 0,
       'juggled': (1, 0, 2),
       'tickdir': 1},
 'y': {'color': (0.9, 0.9, 0.9, 0.5),
       'i': 1,
       'juggled': (0, 1, 2),
       'tickdir': 0},
 'z': {'color': (0.925, 0.925, 0.925, 0.5),
       'i': 2,
       'juggled': (0, 2, 1),
       'tickdir': 0}}

Однако параметр цвета изменяет цвет фона плоскостей осей (между проводными сеткой), а не цвет краев этих плоскостей.

Я слишком глубоко копаю?

matplotlib


2 ответа


2 Решение Niriel [2012-02-10 12:55:00]

Оказывается, это невозможно, поскольку эти значения жестко закодированы. Это архивированное письмо из списка рассылки пользователей matplotlib помогло мне. Здесь соответствующая часть:

К сожалению, вы наткнулись на одно из уродств mplot3d реализация. Я надеюсь, что у вас будет больше возможностей для следующего выпуск. Но сейчас нет возможности отключить оси (потому что они не реализованы как шипы). Если вы действительно хотите исходный код, вы можете изменить цветовой аргумент на вызов Line2D в метод init3d() в matplotlib/lib/mpl_toolkits/axis3d.py

Хотя этот ответ касался еще одной проблемы, он отправил меня в направлении axis3d.py. Я нашел его в /usr/lib/pymodules/python2.7/mpl_toolkits/mplot3d. Я сделал резервную копию оригинального axis3d.py, и я переместил axis3d.pyc в сторону.

Так как код довольно короткий и достаточно хорошо написанный, не потребовалось много времени, чтобы найти две строки, которые мне пришлось изменить.

  • Чтобы изменить цвет краев отдельных осей, я изменил self.line=... в __init__: просто замените color=(0, 0, 0, 1) на color=(1, 0, 0, 1) для ужасно кричащего красного цвета. Компоненты кортежа - красный, зеленый, синий, альфа, все поплавки от 0 до 1.
  • Чтобы изменить цвет сетки, я изменил метод draw. Я заменил цвет self.gridlines.set_color([(0.9,0.9,0.9,1)] * len(lines)) на что-то по своему выбору.

И это, это просто работает. Не самый удобный, но он не работает больше, чем редактирует файл конфигурации rc.

Я не воссоздал файл .pyc. Он не воссоздает себя, потому что я не запускаю свой код python как root. Я не против дополнительных миллисекунд, которые python должен перекомпилировать .py каждый раз.


2 Vadym [2013-10-24 23:37:00]

Вместо изменения axis3d.py попробуйте следующее: ax.w_xaxis.line.set_color("red")