Curso matplotlib - Gráfico de barras verticais (preenchimento das barras)
Além de trocar as cores das barras, podemos adicionar preenchimento a elas (texturas), de forma a diferenciar as barras de uma forma mais visual. O uso de texturas é mais adequado do que cores para publicações, embora você deva ter a simplicidade sempre em mente.
Mas antes de adicionar texturas, vamos deixar as barras sem preenchimento e aumentar o tamanho do gráfico:
plt.figure(figsize=(14,6))
plt.bar(x-2*width_bar, loja_1, label='Loja 1', width=width_bar, align='edge', color='none', edgecolor='k')
plt.bar(x-width_bar, loja_2, label='Loja 2', width=width_bar, align='edge', color='none', edgecolor='k')
plt.bar(x+width_bar, loja_3, label='Loja 3', width=-width_bar, align='edge', color='none', edgecolor='k')
plt.bar(x+2*width_bar, loja_4, label='Loja 4', width=-width_bar, align='edge', color='none', edgecolor='k')
plt.legend(prop={'size': 16})
plt.xticks(x, frutas)
plt.show()
Figura 1 - Gráfico de barras verticais agrupado.

Para adicionar estas texturas (os hatchs) nas barras, precisamos passar e estilo desejado através do parâmetro hatch em plt.bar(). Você encontra maiores informações na documentação.
As opções de hatchs são: "/", "\", "|" , "-", "+", "x", "o", "O", ".", "*".

Fonte: www.matplotlib.org
Por exemplo:
plt.figure(figsize=(14,6))
plt.bar(x-2*width_bar, loja_1, label='Loja 1', width=width_bar, align='edge', color='none', edgecolor='k', hatch='/')
plt.bar(x-width_bar, loja_2, label='Loja 2', width=width_bar, align='edge', color='none', edgecolor='k', hatch='X')
plt.bar(x+width_bar, loja_3, label='Loja 3', width=-width_bar, align='edge', color='none', edgecolor='k', hatch='O')
plt.bar(x+2*width_bar, loja_4, label='Loja 4', width=-width_bar, align='edge', color='none', edgecolor='k', hatch='*')
plt.legend(prop={'size': 16})
plt.xticks(x, frutas)
plt.show()
Figura 2 - Gráfico de barras verticais com barras estilizadas.

Também é possível aumentar a densidade de símbolos dentro das barras repetindo o símbolo. Por exemplo: '//', '\\', '||', '--', '++', 'xx', 'oo', 'OO', '..', '**'.

Fonte: www.matplotlib.org
Exemplo:
plt.figure(figsize=(14,6))
plt.bar(x-2*width_bar, loja_1, label='Loja 1', width=width_bar, align='edge', color='none', edgecolor='k', hatch='//')
plt.bar(x-width_bar, loja_2, label='Loja 2', width=width_bar, align='edge', color='none', edgecolor='k', hatch='XX')
plt.bar(x+width_bar, loja_3, label='Loja 3', width=-width_bar, align='edge', color='none', edgecolor='k', hatch='OO')
plt.bar(x+2*width_bar, loja_4, label='Loja 4', width=-width_bar, align='edge', color='none', edgecolor='k', hatch='**')
plt.legend(prop={'size': 16})
plt.xticks(x, frutas)
plt.show()
Figura 3 - Gráfico de barras verticais com barras estilizadas.

Ainda é possível combinar padrões, por exemplo: '/o', '\|', '|*', '-\\', '+o', 'x*', 'o-', 'O|', 'O.', '*-'.

Fonte: www.matplotlib.org
Por exemplo:
plt.figure(figsize=(14,6))
plt.bar(x-2*width_bar, loja_1, label='Loja 1', width=width_bar, align='edge', color='none', edgecolor='k', hatch='/o')
plt.bar(x-width_bar, loja_2, label='Loja 2', width=width_bar, align='edge', color='none', edgecolor='k', hatch='X*')
plt.bar(x+width_bar, loja_3, label='Loja 3', width=-width_bar, align='edge', color='none', edgecolor='k', hatch='O|')
plt.bar(x+2*width_bar, loja_4, label='Loja 4', width=-width_bar, align='edge', color='none', edgecolor='k', hatch='*-')
plt.legend(prop={'size': 16})
plt.xticks(x, frutas)
plt.show()
Figura 4 - Gráfico de barras verticais com barras estilizadas.

Com todas estas combinações, temos infinitas possibilidades para utilizar como texturas. Entretanto, a simplicidade é sempre recomendada, e então utilizar os símbolos simples como '/', '\', '-', 'x', '+', 'O' é geralmente uma melhor escolha.