seaborn色调barplot地图

时间:2018-02-01 15:09:19

标签: dictionary bar-chart seaborn

我有这样的数据:

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

有什么想法吗?

1 个答案:

答案 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()

enter image description here

现在这可能是也可能不是你想要的。因此最终使用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()

enter image description here