2

を使用しmatplotlibて、次のような遅延のリストをプロットしたいと思います。

  • X軸には、リストに遅延の位置があります
  • Y軸には遅延自体があります

さて、私のリストには特別な値「L」があり、それが発生するたびに X 軸に赤い十字として描きたいと思っています。

この最後のことをどうすればいいですか?

4

1 に答える 1

2

これを行うには、さまざまな方法があります。

まず、ブール値のインデックスを使用できるように、データを 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)。これを行うには、BlendedGenericTransform2 つの異なる変換を使用する 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()
于 2013-01-27T21:57:28.947 に答える