を使用しmatplotlib
て、次のような遅延のリストをプロットしたいと思います。
- X軸には、リストに遅延の位置があります
- Y軸には遅延自体があります
さて、私のリストには特別な値「L」があり、それが発生するたびに X 軸に赤い十字として描きたいと思っています。
この最後のことをどうすればいいですか?
を使用しmatplotlib
て、次のような遅延のリストをプロットしたいと思います。
さて、私のリストには特別な値「L」があり、それが発生するたびに X 軸に赤い十字として描きたいと思っています。
この最後のことをどうすればいいですか?
これを行うには、さまざまな方法があります。
まず、ブール値のインデックスを使用できるように、データを numpy 配列にしましょう。これにより、「フラグが立てられた」"L"
値をデータ値から簡単に分離できます。
理想的には、「L」値がマスクされたマスク配列に変換します (データ型が混在するのではなく、どこにでも浮動します)。ただし、簡単にするために、ここではオブジェクト配列を使用して、文字列と浮動小数点数を混在できるようにします。
import matplotlib.pyplot as plt
import numpy as np
delays = np.array([0.5, 2.3, 'L', 0.9, 'L', 2], dtype=object)
x = np.arange(delays.size)
fig, ax = plt.subplots()
ax.plot(x[delays != 'L'], delays[delays != 'L'], 'bo')
# Expand axis limits by 0.5 in all directions for easier viewing
limits = np.array(ax.axis())
ax.axis(limits + [-0.5, 0.5, -0.5, 0.5])
flag_positions = x[delays == 'L']
ax.plot(flag_positions, np.zeros_like(flag_positions), 'rx',
clip_on=False, mew=2)
plt.show()
ただし、赤い x は固定の y 位置にあり、パンまたはズームすると、x 軸から外れます。
カスタム変換を使用すると、これを回避できます。この場合、x 座標で「通常の」データ座標 ( ax.transData
) を使用し、y 座標で軸座標系を使用する必要があります (たとえば、0 が下で 1 が上である 0-1: ax.transAxes
)。これを行うには、BlendedGenericTransform
2 つの異なる変換を使用する a を使用します。1 つは x 座標用で、もう 1 つは y 座標用です。
したがって、x
プロットがどのようにパンまたはズームされているかに関係なく、 red が常に x 軸上にあるようにするには、次のようにします。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.transforms import BlendedGenericTransform
delays = np.array([0.5, 2.3, 'L', 0.9, 'L', 2], dtype=object)
x = np.arange(delays.size)
fig, ax = plt.subplots()
ax.plot(x[delays != 'L'], delays[delays != 'L'], 'bo')
flags = x[delays == 'L']
ax.plot(flags, np.zeros_like(flags), 'rx', clip_on=False, mew=2,
transform=BlendedGenericTransform(ax.transData, ax.transAxes))
# Expand axis limits by 0.5 in all directions for easier viewing
limits = np.array(ax.axis())
ax.axis(limits + [-0.5, 0.5, -0.5, 0.5])
plt.show()
マスクされた配列を使用して、物事を少しきれいにすることができます ( も参照してくださいpandas
)。pandas
欠損データを示すには、文字列値と浮動小数点値が混在するオブジェクト配列を使用するよりも、マスクされた配列 (または) を使用する方が適しています。例として:
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.transforms import BlendedGenericTransform
delays = [0.5, 2.3, 'L', 0.9, 'L', 2]
delays = [item if item != 'L' else np.nan for item in delays]
delays = np.ma.masked_invalid(delays)
fig, ax = plt.subplots()
ax.plot(delays, 'bo')
flags = delays.mask.nonzero()
ax.plot(flags, np.zeros_like(flags), 'rx', clip_on=False, mew=2,
transform=BlendedGenericTransform(ax.transData, ax.transAxes))
# Expand axis limits by 0.5 in all directions for easier viewing
limits = np.array(ax.axis())
ax.axis(limits + [-0.5, 0.5, -0.5, 0.5])
plt.show()