Есть ли простой способ использовать логарифмическую шкалу на графиках matplotlib, отображающих данные с помощью пользовательской функции (wedge)?

#python #matplotlib #plot #logarithm

#python #matplotlib #график #логарифм

Вопрос:

Я строю данные с использованием клиньев (то же самое относится к участкам / кругам / etc). Это работает хорошо, но я хочу построить логарифмические данные.

Для обычных графиков существует

 plt.yscale('log')
plt.xscale('log')
  

но здесь это не работает и приводит к :

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

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

Смотрите Рабочую часть моего кода ниже:

 import matplotlib.pylot as plt
from matplotlib.patches import Wedge
import seaborn as sns
import numpy as np

from matplotlib.patches import Wedge
def dual_half_circle(center, radius, angle=0, ax=None, colors=('w','k'),
                     **kwargs):
    """
    Add two half circles to the axes *ax* (or the current axes) with the 
    specified facecolors *colors* rotated at *angle* (in degrees).
    """
    if ax is None:
        ax = plt.gca()
    theta1, theta2 = angle, angle   180
    w1 = Wedge(center, radius, theta1, theta2, fc=colors[0], **kwargs)
    w2 = Wedge(center, radius, theta2, theta1, fc=colors[1], **kwargs)
    for wedge in [w1, w2]:
        ax.add_artist(wedge)
    return [w1, w2]


fig, ax = plt.subplots(figsize=(30,15))
for i in range(10):
    dual_half_circle((100*i, 100*i), radius=10, angle=90, ax=ax,colors=('r','b'))
plt.xlim(0,1000)
plt.ylim(0,1000)
plt.show()
  

Спасибо за вашу помощь!

Ответ №1:

Ошибка возникает из-за ваших ограничений x и y. Выберите значение выше 0, и все должно быть в порядке.


Скорректированный код:

 import matplotlib.pyplot as plt
from matplotlib.patches import Wedge
def dual_half_circle(center, radius, angle=0, ax=None, colors=('w','k'),
                     **kwargs):
    """
    Add two half circles to the axes *ax* (or the current axes) with the
    specified facecolors *colors* rotated at *angle* (in degrees).
    """
    if ax is None:
        ax = plt.gca()
    theta1, theta2 = angle, angle   180
    w1 = Wedge(center, radius, theta1, theta2, fc=colors[0], **kwargs)
    w2 = Wedge(center, radius, theta2, theta1, fc=colors[1], **kwargs)
    for wedge in [w1, w2]:
        ax.add_artist(wedge)
    return [w1, w2]


_, ax = plt.subplots(figsize=(30, 15))
for i in range(10):
    dual_half_circle((100*i, 100*i), radius=10, angle=90, ax=ax,colors=('r', 'b'))
plt.xlim(1, 1000)
plt.ylim(1, 1000)
plt.xscale('log')
plt.yscale('log')
plt.show()
  

Результат:

введите описание изображения здесь

Комментарии:

1. Это правда. Знаете ли вы, что отличается в моей функции, приводящей к ошибке?

2. Отредактировал ответ соответствующим образом 🙂

3. Спасибо, но, тем не менее, ошибка ValueError все еще возникает. Я не думаю, что это было причиной

4. Может быть, это версия matplotlib? Я использую matplotlib 3.03 и python 3.73.

5. Я предполагаю, что дело в зависимостях, и принимаю ваш ответ, если только кто-нибудь не придумает тот, который также работает для matplotlib 2.x