我有这样的数据:
DAY HOUR VALEUR_POINT NAMEDAY
0 0 270.5 Lundi
0 1 275.0 Lundi
0 2 270.0 Lundi
0 3 273.0 Lundi
0 4 268.0 Lundi
0 5 272.0 Lundi
0 6 269.0 Lundi
0 7 270.0 Lundi
0 8 269.0 Lundi
0 9 274.0 Lundi
0 10 274.0 Lundi
0 11 274.0 Lundi
0 12 273.0 Lundi
0 13 271.0 Lundi
0 14 377.0 Lundi
0 15 2685.0 Lundi
0 16 2654.0 Lundi
0 17 2706.0 Lundi
0 18 2751.0 Lundi
0 19 2325.0 Lundi
0 20 274.0 Lundi
0 21 273.0 Lundi
0 22 277.0 Lundi
0 23 276.0 Lundi
1 0 272.5 Mardi
1 1 274.0 Mardi
1 2 266.0 Mardi
1 3 266.0 Mardi
1 4 267.0 Mardi
1 5 274.0 Mardi
1 6 269.0 Mardi
1 7 266.0 Mardi
1 8 270.0 Mardi
1 9 1267.0 Mardi
1 10 2618.0 Mardi
1 11 2610.0 Mardi
1 12 2629.0 Mardi
1 13 2248.0 Mardi
1 14 1897.0 Mardi
我希望使用R脚本达到相同的图形: enter image description here
我试过了:
g = seaborn.FacetGrid(semaine_heure, hue="HOUR",
palette="Set3", size=4, aspect=2)
g.map(seaborn.barplot, 'NAMEDAY', 'Conso_kWh')
pyplot.show()
但它没有归还我想要的东西。 enter image description here
有什么想法吗?
答案 0 :(得分:0)
你可能不想在这里使用facetgrid。而是直接使用条形图是有道理的。 然后,您可以在条形图上循环以设置颜色。
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import numpy as np
# recreate dataframe from the question
jours = ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"]
nom, heure= np.meshgrid(np.arange(len(jours)), np.arange(24))
df = pd.DataFrame({"jour" : nom.flatten(), "heure" : heure.flatten(),
"val" : np.random.rand(7*24)})
df["nomjour"] = df["jour"].apply(lambda x: jours[x])
df.sort_values(["jour", "heure"], axis=0, inplace=True)
df.reset_index(inplace=True)
# plot barplot
ax = sns.barplot(x="jour", y="val", hue="heure", data=df)
ax.get_legend().remove()
# colorize bars
cmap = plt.get_cmap("Set3",len(df["jour"].unique()))
for i, bar in enumerate(ax.patches):
color=cmap(i % len(df["jour"].unique()))
bar.set_color(color)
plt.show()
现在这可能是也可能不是你想要的。因此最终使用seaborn可能不是最好的想法,并且通常的matplotlib条形图更加可取。
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import pandas as pd
import numpy as np
# recreate dataframe from the question
jours = ["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"]
nom, heure= np.meshgrid(np.arange(len(jours)), np.arange(24))
df = pd.DataFrame({"jour" : nom.flatten(), "heure" : heure.flatten(),
"val" : np.random.rand(7*24)})
df["nomjour"] = df["jour"].apply(lambda x: jours[x])
df.sort_values(["jour", "heure"], axis=0, inplace=True)
df.reset_index(inplace=True)
# modify df to have jour et heure
df["jourheure"] = 24*df["jour"]+df["heure"]
# plot barplot
fig, ax = plt.subplots()
bars = ax.bar(df["jourheure"], df["val"], width=1)
# colorize bars
cmap = plt.get_cmap("Set3",len(df["jour"].unique()))
for i, bar in enumerate(ax.patches):
color=cmap(i // len(df["heure"].unique()))
bar.set_color(color)
#Now use a formatter for the labels
ax.xaxis.set_major_locator(ticker.MultipleLocator(6))
f = lambda x,_: "%g" % (x%len(df["heure"].unique()))
ax.xaxis.set_major_formatter(ticker.FuncFormatter(f))
plt.show()