【问题标题】:IndentationError while plotting the Gauge绘制仪表时出现缩进错误
【发布时间】:2020-09-04 05:54:38
【问题描述】:

谁能解释一下为什么下面的代码会抛出 IndentationError。

我正在尝试绘制具有某种实时值的仪表。这段代码之前运行良好,现在当我重新启动系统时,相同的代码会引发错误。请解释错误。

%matplotlib inline
import os, sys
import matplotlib
from matplotlib import cm
from matplotlib import pyplot as plt
import numpy as np
from matplotlib.patches import Circle, Wedge, Rectangle


def degree_range(n): 
    start = np.linspace(0,180,n+1, endpoint=True)[0:-1]
    end = np.linspace(0,180,n+1, endpoint=True)[1::]
    mid_points = start + ((end-start)/2.)
    yield np.c_[start, end], mid_points
def rot_text(ang): 
    rotation = np.degrees(np.radians(ang) * np.pi / np.pi - np.radians(90))
    yield rotation

def gauge(labels=['LOW','MEDIUM','HIGH','VERY HIGH','EXTREME'], 
          colors='jet_r', arrow=1, title='', fname=False): 
    """
    some sanity checks first

    """
    N = len(labels)
    if arrow > N: 
        raise Exception("\n\nThe category ({}) is greated than \
        the length\nof the labels ({})".format(arrow, N))
    """
    if colors is a string, we assume it's a matplotlib colormap
    and we discretize in N discrete colors 
    """
    if isinstance(colors, str):
        cmap = cm.get_cmap(colors, N)
        cmap = cmap(np.arange(N))
        colors = cmap[::-1,:].tolist()
    if isinstance(colors, list): 
        if len(colors) == N:
            colors = colors[::-1]
        else: 
            raise Exception("\n\nnumber of colors {} not equal \
            to number of categories{}\n".format(len(colors), N))
    """
    begins the plotting
    """

    fig, ax = plt.subplots()

    ang_range, mid_points = degree_range(N)

    labels = labels[::-1]

    """
    plots the sectors and the arcs
    """
    patches = []
    for ang, c in zip(ang_range, colors): 
        # sectors
        patches.append(Wedge((0.,0.), .4, *ang, facecolor='w', lw=2))
        # arcs
        patches.append(Wedge((0.,0.), .4, *ang, width=0.10, facecolor=c, lw=2, alpha=0.5))

    [ax.add_patch(p) for p in patches]


    """
    set the labels (e.g. 'LOW','MEDIUM',...)
    """

    for mid, lab in zip(mid_points, labels): 

        ax.text(0.35 * np.cos(np.radians(mid)), 0.35 * np.sin(np.radians(mid)), lab, \
            horizontalalignment='center', verticalalignment='center', fontsize=14, \
            fontweight='bold', rotation = rot_text(mid))

    """
    set the bottom banner and the title
    """
    r = Rectangle((-0.4,-0.1),0.8,0.1, facecolor='w', lw=2)
    ax.add_patch(r)

    ax.text(0, -0.05, title, horizontalalignment='center', \
         verticalalignment='center', fontsize=22, fontweight='bold')

    """
    plots the arrow now
    """

    pos = mid_points[abs(arrow - N)]

    ax.arrow(0, 0, 0.225 * np.cos(np.radians(pos)), 0.225 * np.sin(np.radians(pos)), \
                 width=0.04, head_width=0.09, head_length=0.1, fc='k', ec='k')

    ax.add_patch(Circle((0, 0), radius=0.02, facecolor='k'))
    ax.add_patch(Circle((0, 0), radius=0.01, facecolor='w', zorder=11))

    """
    removes frame and ticks, and makes axis equal and tight
    """

    ax.set_frame_on(False)
    ax.axes.set_xticks([])
    ax.axes.set_yticks([])
    ax.axis('equal')
    plt.tight_layout()
    if fname:
        fig.savefig(fname, dpi=200)

       gauge(labels=['LOW','MEDIUM','HIGH'], \
      colors=['r','y','g'], arrow=2, title='something here') 

请帮助并解释我犯了什么错误? 我已经检查了很多次身份,但仍然无法确定错误。

实际错误是:

> File "<tokenize>", line 91
>     gauge(labels=['LOW','MEDIUM','HIGH'], \
>     ^ IndentationError: unindent does not match any outer indentation level

【问题讨论】:

  • 代码的最后三行都有不同的缩进。你知道 Python 中的块语法是如何工作的吗?

标签: python-3.x matplotlib data-visualization


【解决方案1】:

这是说你的缩进不一致。问题区域在这里:

if fname:
        fig.savefig(fname, dpi=200)

       gauge(labels=['LOW','MEDIUM','HIGH'], \
       ^
      colors=['r','y','g'], arrow=2, title='something here') 

你能看到以gauge 开头的行是如何fig 开头的行后面加一个空格的吗?他们没有排队,Python 正在告诉你这一点。这绝对是一个问题,您继续 gauge(labels=... 语句的行(以 colors 开头也可能是一个问题,因为它也没有与 fig 行对齐。
要解决此问题,请按如下方式更改您的代码:

if fname:
        fig.savefig(fname, dpi=200)
        gauge(labels=['LOW','MEDIUM','HIGH'], colors=['r','y','g'], arrow=2, title='something here') 
        # now everything lines up just fine.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多