Одна из проблем заключается в том, что использование df[['name', 'value1']].plot
заставляет pandas думать, что вам нужно два столбца в строке в кадре данных, один столбец для «имени» и один для «значения1». И тогда pandas запутывается, так как не может нарисовать полосу для «имени» и пропускает их. Затем, для параметра color=
, pandas теперь думает, что первый цвет в списке цветов для 'name', а второй для 'value1'.
Итак, для начала вам нужно вызвать это как df['value1'].plot()
. Тогда pandas действительно любит использовать индекс для оси X. Чтобы в качестве индекса использовалось имя, просто сделайте его индексом вашего фрейма данных.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, LinearSegmentedColormap, Normalize
df = {'name': ['a','b','c','d'], 'value1': [10.1,13.3,9.5,15.1], 'value2': [1.5,2.0,3.5,1.3]}
df = pd.DataFrame(df)
df.set_index('name', inplace=True)
print(df)
colormap_1 = LinearSegmentedColormap.from_list('colorbar', ['#990000','#FF6666'], N=100)
norm = Normalize(vmin=min(df['value2']), vmax=max(df['value2']))
colors = [colormap_1(norm(v)) for v in df['value2']]
df['value1'].plot(kind='bar', color=colors, width=0.8, ylim=[9,16], fontsize=5)
plt.xticks(rotation=90)
plt.ylim([9,16])
plt.tight_layout()
plt.savefig('test.png',dpi=600)
plt.show()
![example plot](https://i.stack.imgur.com/3nlu0.png)
PS: чтобы получить что-то похожее на ваше связанное изображение (таким образом, не используя 'value2'), вы можете поэкспериментировать с:
# same dataframe as before, with 'name' as index
ymin = 9
ymax = 16
barplot = df['value1'].plot(kind='bar', width=0.8, ylim=[ymin, ymax], fontsize=5)
plt.xticks(rotation=90)
gradient = np.linspace(1,0,256).reshape(256,1)
for bar in barplot.containers[0]:
bar.set_facecolor("none")
x, y = bar.get_xy()
w, h = bar.get_width(), bar.get_height()
plt.imshow(gradient, extent=[x, x + w, y + ymin, y + h], aspect="auto", cmap='bone')
plt.imshow(gradient, extent=[*plt.xlim(), *plt.ylim()] ,aspect="auto", cmap='copper_r', zorder=-1)
plt.tight_layout()
#plt.savefig('test.png',dpi=600)
plt.show()