72

折れ線グラフとしてプロットしたい一連のデータがあります。シリーズごとに一部のデータが欠落しています (ただし、シリーズごとに異なります)。現在、matplotlib は欠落しているデータをスキップする線を描画しません: たとえば

import matplotlib.pyplot as plt

xs = range(8)
series1 = [1, 3, 3, None, None, 5, 8, 9]
series2 = [2, None, 5, None, 4, None, 3, 2]

plt.plot(xs, series1, linestyle='-', marker='o')
plt.plot(xs, series2, linestyle='-', marker='o')

plt.show()

線にギャップがあるプロットになります。隙間に線を引くようにmatplotlibに指示するにはどうすればよいですか? (データを補間する必要はありません)。

4

8 に答える 8

95

この方法で NaN 値をマスクできます。

import numpy as np
import matplotlib.pyplot as plt

xs = np.arange(8)
series1 = np.array([1, 3, 3, None, None, 5, 8, 9]).astype(np.double)
s1mask = np.isfinite(series1)
series2 = np.array([2, None, 5, None, 4, None, 3, 2]).astype(np.double)
s2mask = np.isfinite(series2)

plt.plot(xs[s1mask], series1[s1mask], linestyle='-', marker='o')
plt.plot(xs[s2mask], series2[s2mask], linestyle='-', marker='o')

plt.show()

これはにつながります

プロット

于 2013-01-18T13:18:36.283 に答える
3

補間なしでは、データから None を削除する必要があります。これは、シリーズの None に対応する X 値を削除する必要があることも意味します。これを行うための(醜い)ワンライナーを次に示します。

  x1Clean,series1Clean = zip(* filter( lambda x: x[1] is not None , zip(xs,series1) ))

ラムダ関数は、None の値に対して False を返し、リストから x,series のペアをフィルタリングしてから、データを元の形式に再圧縮します。

于 2013-01-18T13:22:53.850 に答える
-1

多分私はポイントを逃しましたが、Pandasはこれを自動的に行うと信じています。以下の例は少し複雑で、インターネット アクセスが必要ですが、中国の線には初期の段階で多くのギャップがあるため、直線セグメントになっています。

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

# read data from Maddison project 
url = 'http://www.ggdc.net/maddison/maddison-project/data/mpd_2013-01.xlsx'
mpd = pd.read_excel(url, skiprows=2, index_col=0, na_values=[' ']) 
mpd.columns = map(str.rstrip, mpd.columns)

# select countries 
countries = ['England/GB/UK', 'USA', 'Japan', 'China', 'India', 'Argentina']
mpd = mpd[countries].dropna()
mpd = mpd.rename(columns={'England/GB/UK': 'UK'})
mpd = np.log(mpd)/np.log(2)  # convert to log2 

# plots
ax = mpd.plot(lw=2)
ax.set_title('GDP per person', fontsize=14, loc='left')
ax.set_ylabel('GDP Per Capita (1990 USD, log2 scale)')
ax.legend(loc='upper left', fontsize=10, handlelength=2, labelspacing=0.15)
fig = ax.get_figure()
fig.show() 
于 2016-01-21T20:33:57.407 に答える