基于数据帧值的多色图

时间:2018-04-05 03:52:32

标签: pandas

我根据数据框绘制图表,如下所示。我想根据条件列显示不同颜色的图表线。我尝试以下代码,但它在整个图表中只显示一种颜色。

df = pd.DataFrame(dict(
        Day=pd.date_range('2018-01-01', periods = 60, freq='D'), 
        Utilisation = np.random.rand(60) * 100))

df = df.astype(dtype= {"Utilisation":"int64"})
df['Condition'] = np.where(df.Utilisation < 10, 'Winter', 
                           np.where(df.Utilisation < 30, 'Summer', 'Spring'))

condition_map = {'Winter': 'r', 'Summer': 'k', 'Spring': 'b'}
df[['Utilisation','Day']].set_index('Day').plot(figsize=(10,4), rot=90, 
                                                color=df.Condition.map(condition_map))

1 个答案:

答案 0 :(得分:1)

所以,我假设你想要一个每个条件的图表。 我会使用groupby来分隔数据。

# Color setting
season_color = {'Winter': 'r', 'Summer': 'k', 'Spring': 'b'}

# Create figure and axes
f, ax = plt.subplots(figsize = (10, 4))

# Loop over and plot each group of data
for cond, data in df.groupby('Condition'):
    ax.plot(data.Day, data.Utilisation, color = season_color[cond], label = cond)

# Fix datelabels
f.autofmt_xdate()

f.legend()
f.show()

如果您确实希望将日期刻度旋转90度,请使用autofmt_xdate(rotation = 90)

<强>更新

如果你想在一行中绘制所有内容,那么它有点棘手,因为一行只能与 一个 颜色相关联。

您可以在每个点之间绘制一条线,如果它穿过“颜色边界”,则分割一条线,或者查看此pyplot示例:multicolored line

另一种可能性是在每个点之间绘制许多散点,并创建一个代表颜色边界的自己的colormap

要创建色彩图(和标准),我使用from_levels_and_colors

import matplotlib.colors

colors = ['#00BEC5', '#a0c483', '#F9746A']
boundaries = [0, 10, 30, 100]
cm, nrm = matplotlib.colors.from_levels_and_colors(boundaries, colors)

要将每个点连接到下一个点,您可以shift数据帧,但在这里我只是zip原始df的切片版本

from itertools import islice

f, ax = plt.subplots(figsize = (10,4))
for (i,d0), (i,d1) in zip(df.iterrows(), islice(df.iterrows(), 1, None)):    
    d_range = pd.date_range(d0.Day, d1.Day, freq = 'h')
    y_val = np.linspace(d0.Utilisation, d1.Utilisation, d_range.size)
    ax.scatter(d_range, y_val, c = y_val, cmap = cm, norm = nrm)

f.autofmt_xdate()
f.show()

enter image description here