我根据数据框绘制图表,如下所示。我想根据条件列显示不同颜色的图表线。我尝试以下代码,但它在整个图表中只显示一种颜色。
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))
答案 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()