Matplotlib: Проверить на пустой участок - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть цикл, который загружает и отображает некоторые данные, что-то вроде этого:

import os
import numpy as np
import matplotlib.pyplot as plt

for filename in filenames:
    plt.figure()
    if os.path.exists(filename):
        x, y = np.loadtxt(filename, unpack=True)
        plt.plot(x, y)
    plt.savefig(filename + '.png')
    plt.close()

Теперь, если файл не существует, данные не загружаются или отображаются, но (пустая) фигуравсе еще сохранен.В приведенном выше примере я мог бы исправить это, просто включив все вызовы plt внутри оператора if.Мой реальный случай использования несколько более сложен, и поэтому я ищу способ спросить matplotlib / plt / фигура / ось, является ли фигура / ось полностью пустой или нет.Что-то вроде

for filename in filenames:
    plt.figure()
    if os.path.exists(filename):
        x, y = np.loadtxt(filename, unpack=True)
        plt.plot(x, y)
    if not plt.figure_empty():  # <-- new line
        plt.savefig(filename + '.png')
    plt.close()

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Как вы говорите, очевидное решение состоит в том, чтобы включить сохранение в оператор if

for filename in filenames:
    plt.figure()
    if os.path.exists(filename):
        x, y = np.loadtxt(filename, unpack=True)
        plt.plot(x, y)
        plt.savefig(filename + '.png')  # <-- indentation here
    plt.close()

Иначе, это будет зависеть от того, что на самом деле означает «пустой».Если фигура не содержит осей,

for filename in filenames:
    fig = plt.figure()
    if os.path.exists(filename):
        x, y = np.loadtxt(filename, unpack=True)
        plt.plot(x, y)
    if len(fig.axes) > 0:  
        plt.savefig(filename + '.png')
    plt.close()

Однако это как-то обходные пути.Я думаю, что вы действительно хотите выполнить логический шаг самостоятельно.

for filename in filenames:
    plt.figure()
    save_this = False
    if os.path.exists(filename):
        x, y = np.loadtxt(filename, unpack=True)
        plt.plot(x, y)
        save_this = True
    if save_this:
        plt.savefig(filename + '.png')
    plt.close()
0 голосов
/ 18 сентября 2018

Чтобы проверить, есть ли у топора данные, нарисованные с использованием plot():

if ax.lines:

Если они были нарисованы с использованием scatter() вместо:

if ax.collections:
0 голосов
/ 18 сентября 2018

Работает ли проверка ваших осей на рисунке с fig.get_axes() для ваших целей?

fig = plt.figure()
if fig.get_axes():
    # Do stuff when the figure isn't empty.
...