是否有一种简单的方法可以通过自定义函数(楔形)在显示数据的matplotlib图上使用对数刻度?

时间:2019-04-12 12:13:53

标签: python matplotlib plot logarithm

我正在使用楔形图绘制数据(对于补丁/圆形/等也是如此)。 这很好用,但是我想对数绘制数据。

对于普通地块,有

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

但这在这里不起作用,结果为:

  

ValueError:数据没有正值,因此无法进行日志缩放。

我当然可以将所有数据转换为相应的日志并调整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 个答案:

答案 0 :(得分:2)

该错误是由您的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()

结果:

enter image description here