import pandas as pd
# using the existing lists from the OP, create the dataframe
df = pd.DataFrame(data={'y': y,'z': z,'k': k}, index=x)# since there's no time component and x was a datetime dtype, set the index to be just the date
df.index = df.index.date
# display(df)
y z k
2011-01-0441112011-01-0592122011-01-062313# plot bars or kind='barh' for horizontal bars; adjust figsize accordingly
ax = df.plot(kind='bar', rot=0, xlabel='Date', ylabel='Value', title='My Plot', figsize=(6,4))# add some labelsfor c in ax.containers:# set the bar label
ax.bar_label(c, fmt='%.0f', label_type='edge')# add a little space at the top of the plot for the annotation
ax.margins(y=0.1)# move the legend out of the plot
ax.legend(title='Columns', bbox_to_anchor=(1,1.02), loc='upper left')
ax = df.plot(kind='barh', ylabel='Date', title='My Plot', figsize=(5,4))
ax.set(xlabel='Value')for c in ax.containers:# set the bar label
ax.bar_label(c, fmt='%.0f', label_type='edge')
ax.margins(x=0.1)# move the legend out of the plot
ax.legend(title='Columns', bbox_to_anchor=(1,1.02), loc='upper left')
import numpy as np
import matplotlib.pyplot as plt
N =3
ind = np.arange(N)# the x locations for the groups
width =0.27# the width of the bars
fig = plt.figure()
ax = fig.add_subplot(111)
yvals =[4,9,2]
rects1 = ax.bar(ind, yvals, width, color='r')
zvals =[1,2,3]
rects2 = ax.bar(ind+width, zvals, width, color='g')
kvals =[11,12,13]
rects3 = ax.bar(ind+width*2, kvals, width, color='b')
ax.set_ylabel('Scores')
ax.set_xticks(ind+width)
ax.set_xticklabels(('2011-Jan-4','2011-Jan-5','2011-Jan-6'))
ax.legend((rects1[0], rects2[0], rects3[0]),('y','z','k'))defautolabel(rects):for rect in rects:
h = rect.get_height()
ax.text(rect.get_x()+rect.get_width()/2.,1.05*h,'%d'%int(h),
ha='center', va='bottom')
autolabel(rects1)
autolabel(rects2)
autolabel(rects3)
plt.show()
defbar_plot(ax, data, group_stretch=0.8, bar_stretch=0.95,
legend=True, x_labels=True, label_fontsize=8,
colors=None, barlabel_offset=1,
bar_labeler=lambda k, i, s:str(round(s,3))):"""
Draws a bar plot with multiple bars per data point.
:param dict data: The data we want to plot, wher keys are the names of each
bar group, and items is a list of bar values for the corresponding group.
:param float group_stretch: 1 means groups occupy the most (largest groups
touch side to side if they have equal number of bars).
:param float bar_stretch: If 1, bars within a group will touch side to side.
:param bool x_labels: If true, x-axis will contain labels with the group
names given at data, centered at the bar group.
:param int label_fontsize: Font size for the label on top of each bar.
:param float barlabel_offset: Distance, in y-values, between the top of the
bar and its label.
:param function bar_labeler: If not None, must be a functor with signature
``f(group_name, i, scalar)->str``, where each scalar is the entry found at
data[group_name][i]. When given, returns a label to put on the top of each
bar. Otherwise no labels on top of bars.
"""
sorted_data =list(sorted(data.items(), key=lambda elt: elt[0]))
sorted_k, sorted_v =zip(*sorted_data)
max_n_bars =max(len(v)for v in data.values())
group_centers = np.cumsum([max_n_bars
for _ in sorted_data])-(max_n_bars /2)
bar_offset =(1- bar_stretch)/2
bars = defaultdict(list)#if colors isNone:
colors ={g_name:[f"C{i}"for _ in values]for i,(g_name, values)inenumerate(data.items())}#for g_i,((g_name, vals), g_center)inenumerate(zip(sorted_data,
group_centers)):
n_bars =len(vals)
group_beg = g_center -(n_bars /2)+(bar_stretch /2)for val_i, val inenumerate(vals):
bar = ax.bar(group_beg + val_i + bar_offset,
height=val, width=bar_stretch,
color=colors[g_name][val_i])[0]
bars[g_name].append(bar)if bar_labeler isnotNone:
x_pos = bar.get_x()+(bar.get_width()/2.0)
y_pos = val + barlabel_offset
barlbl = bar_labeler(g_name, val_i, val)
ax.text(x_pos, y_pos, barlbl, ha="center", va="bottom",
fontsize=label_fontsize)if legend:
ax.legend([bars[k][0]for k in sorted_k], sorted_k)#
ax.set_xticks(group_centers)if x_labels:
ax.set_xticklabels(sorted_k)else:
ax.set_xticklabels()return bars, group_centers