raspberry-pi - 用python Linux(无GUI)中生成统计图
阿神
阿神 2017-04-18 09:41:26
0
1
622

我有这样一个需求:在我的raspberry pi 3中运行着一个爬虫程序,根据爬到的数据,使用matplotlib自动生成统计图(图片格式),然后发送到我的邮箱.

但是我ssh远程登录树莓派,运行如下脚本生成test.png图片时

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

t = np.arange(0.0, 10.0, 0.001)
s = np.sin(2*np.pi*t)
plt.plot(t, s)

plt.xlabel('time (s)')
plt.ylabel('voltage (mV)')
plt.title('About as simple as it gets, folks')
plt.grid(True)
plt.savefig("test.png")

出现如下错误:

(process:2818): Gtk-WARNING **: Locale not supported by C library.
           Using the fallback 'C' locale.
Unable to init server: Could not connect: Connection refused
Unable to init server: Could not connect: Connection refused

(simple_plot.py:2818): Gdk-CRITICAL **: gdk_cursor_new_for_display: assertion 'GDK_IS_DISPLAY (display)' failed
Traceback (most recent call last):
  File "simple_plot.py", line 1, in <module>
    import matplotlib.pyplot as plt
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/pyplot.py", line 114, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_gtk3agg.py", line 11, in <module>
    from . import backend_gtk3
  File "/usr/local/lib/python2.7/dist-packages/matplotlib/backends/backend_gtk3.py", line 58, in <module>
    cursors.MOVE          : Gdk.Cursor.new(Gdk.CursorType.FLEUR),
TypeError: constructor returned NULL

而我在树莓派gui系统中运行上述脚本是可以生成test.png文件的。
所以上述错误只是出现在无gui的情况下,google了多个结果都没有解决方法。

  1. 使用python绘制统计图库(类似matplotlib)可以在无gui的情况下根据所给数据生成统计图(png,jpeg等等)。

  2. 或者有别的方法实现我上述需求。

阿神
阿神

闭关修行中......

全員に返信(1)
阿神

リーリー

の理由 matplotlib.use("Agg") の前に import matplotlib.pyplot as plt が置かれている理由を説明する以下の文章を公式サイトで見つけました。 @sPeng のおかげで、matplotlib.use("Pdf") を使用することでもこのエラーを解決できます。

use() 関数を使用する場合、これは matplotlib.pyplot をインポートする前に行う必要があります。次の場合、pyplot のインポート後に use() を呼び出しても効果はありません。ユーザーは別のバックエンドを使用したいと考えているため、絶対に必要な場合を除き、明示的に use() を呼び出すことは避けてください。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!