Доступ к оси или фигуре в ggplot на python

Python ggplot великолепен, но все еще нов, и я считаю необходимым использовать традиционные методы matplotlib для модификации моих графиков. Но я не уверен, как передать экземпляр оси в ggplot или получить его обратно.

Допустим, я строю сюжет примерно так:

import ggplot as gp

(явный импорт)

p = gp.ggplot(gp.aes(x='basesalary', y='compensation'), data = df)
p + gp.geom_histogram(binwidth = 10000)      

Пока проблем нет. Но теперь допустим, что я хочу ось Y в логарифмическом масштабе. Я хотел бы иметь возможность сделать это:

plt.gca().set_yscale('log')

К несчастью, plt.gca() не имеет доступа к оси, созданной ggplot, Я получаю две фигуры: гистограмму из ggplot в линейном масштабе и пустую фигуру с логарифмической осью y.

Я пробовал несколько вариантов с обоими gca() а также gcf() безуспешно.

3 ответа

Решение

Возможно, произошли некоторые изменения с 2013 года, когда был задан этот вопрос. Способ получения фигуры matplotlib из ggplot

g.make()

после этого фигура и оси могут быть получены с помощью

fig = plt.gcf()
ax = plt.gca()

или, если есть больше осей, axes = fig.axes,

Затем в matplotlib могут быть добавлены дополнительные функции, как показано в ответе на этот вопрос.

Наконец, сюжет можно сохранить с помощью обычного savefig команда.

Полный пример:

import ggplot as gp
import matplotlib.pyplot as plt

# produce ggplot
g = gp.ggplot(gp.aes(x='carat', y='price'), data=gp.diamonds)
g = g + gp.geom_point()
g = g + gp.ylab(' ')+ gp.xlab(' ')
# Make
g.make()

# obtain figure from ggplot
fig = plt.gcf()
ax = plt.gca()
# adjust some of the ggplot axes' parameters
ax.set_title("ggplot plot")
ax.set_xlabel("Some x label")
plt.savefig(__file__+".png")
plt.show()

[Это устарело с текущей ggpy]

Теперь есть scale_y_log(), Если вы хотите сделать что-то в matplotlibВы можете получить текущую фигуру / ось с

g = ggplot(...)
fig = g.draw()
#or
g.draw() # or print(g)
fig = plt.gcf() 
ax = plt.gca()

Ваша версия не работает, потому что ggplots рисует график на print(g) в ggplot.__repr__() метод (который вызывает ggplot.draw()) так что просто нет matplotlib фигура сразу после создания объекта ggplot, но только после print (или же g.draw()). g.draw() также возвращает значение, поэтому вам не нужно использовать plt.gcf()

Ты пробовал:

p = gp.ggplot(gp.aes(x='basesalary', y='compensation'), data = df)
p + gp.geom_histogram(binwidth = 10000) + gp.scale_y_log()

Не уверен, работает ли он просто так, просто догадываясь, глядя на код...

Другие вопросы по тегам