10

次のようなプロットを作成しましたここに画像の説明を入力

いくつか問題があります:

  1. 週末を具体的に表示するにはどうすればよいですか。私が考えていたいくつかの方法は、週末に対応するインデックスを取得し、xlims の間に透明なバーを描画することでした。また、同じように長方形を描くこともできます。Pandasで地味にできれば最高です。
  2. 日付の書式設定は最もきれいではありません

以下は、このプロットを生成するために使用されるコードです

ax4=df4.plot(kind='bar',stacked=True,title='Mains 1 Breakdown');
ax4.set_ylabel('Power (W)');
idx_weekend=df4.index[df4.index.dayofweek>=5]
ax.bar(idx_weekend.to_datetime(),[1800 for x in range(10)])

は特に週末を強調するためのax.barものですが、目に見える出力は生成されません。(問題 1) 問題 2 については、Major Formatter と Locators を使用しようとしましたが、コードは次のとおりです。

ax4=df4.plot(kind='bar',stacked=True,title='Mains 1 Breakdown');
ax4.set_ylabel('Power (W)');
formatter=matplotlib.dates.DateFormatter('%d-%b');
locator=matplotlib.dates.DayLocator(interval=1);
ax4.xaxis.set_major_formatter(formatter);
ax4.xaxis.set_major_locator(locator);

生成される出力は次のとおりです。 ここに画像の説明を入力

データフレームがどのように見えるかを知っておくと役立つ場合があります

In [122]:df4

Out[122]:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 36 entries, 2011-04-19 00:00:00 to 2011-05-24 00:00:00
Data columns:
(0 to 6 AM) Dawn          19  non-null values
(12 to 6 PM) Dusk         19  non-null values
(6 to 12 Noon) Morning    19  non-null values
(6PM to 12 Noon) Night    20  non-null values
dtypes: float64(4)
4

2 に答える 2

13

私はたくさん試しましたが、今のところこれらのハックはうまくいきます。より Pythonic で一貫したソリューションを待ちます。ラベル付けの問題の解決策:

def correct_labels(ax):
    labels = [item.get_text() for item in ax.get_xticklabels()]
    days=[label.split(" ")[0] for label in labels]
    months=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]
    final_labels=[]
    for i in range(len(days)):
        a=days[i].split("-")
        final_labels.append(a[2]+"\n"+months[int(a[1])-1])
    ax.set_xticklabels(final_labels)

また、プロット中に次の変更を行います

ax=df.plot(kind='bar',rot=0)

これにより、ラベルが 0 回転になります。

週末を見つけて強調表示するために、次の 2 つの関数を作成しました。

def find_weekend_indices(datetime_array):
    indices=[]
    for i in range(len(datetime_array)):
        if datetime_array[i].weekday()>=5:
            indices.append(i)
    return indices

def highlight_weekend(weekend_indices,ax):
    i=0
    while i<len(weekend_indices):
         ax.axvspan(weekend_indices[i], weekend_indices[i]+2, facecolor='green', edgecolor='none', alpha=.2)
         i+=2

これで、プロットはより便利に見え、これらのユース ケースをカバーします。ここに画像の説明を入力

于 2013-05-18T12:27:01.753 に答える
6

Pandas が.dtすべてのシリーズで強力な名前空間をサポートするようになったので、明示的な Python ループを使用せずに、各週末の開始と終了を識別することができます。単純に時間の値を でフィルタリングt.dt.dayofweek >= 5して、週末の時間だけを選択し、毎週異なる作成された値でグループ化します — ここでは、結果がデバッグのために読むのがかなり快適にyear * 100 + weekofyear見えるので使用します。201603

結果の関数は次のとおりです。

def highlight_weekends(ax, timeseries):
    d = timeseries.dt
    ranges = timeseries[d.dayofweek >= 5].groupby(d.year * 100 + d.weekofyear).agg(['min', 'max'])
    for i, tmin, tmax in ranges.itertuples():
        ax.axvspan(tmin, tmax, facecolor='orange', edgecolor='none', alpha=0.1)

軸と軸である時系列を渡すだけでx、週末が強調表示されます!

于 2016-02-05T17:37:09.430 に答える