1. Цвета
Похоже, что в первом случае вы хотите сопоставить разные цвета с первыми полосами ваших данных.
Один из способов сделать это - настроить карту цветов , а затем примените его к первым трем полосам. Здесь я только что выбрал цветовую карту matplotlib по умолчанию, но есть из чего выбрать, поэтому, если значение по умолчанию вам не подходит, я бы посоветовал проверить сообщение о выборе цветовой карты . В большинстве случаев следует стараться придерживаться перцептуально постоянной карты.
2. Легенда
Это должно быть просто вопросом вызова ax.legend()
. Хотя будьте осторожны при установке положения легенды за пределы графика, так как вам нужно сделать некоторые дополнительные уточнения при сохранении в pdf, , как описано здесь. .
Однако вы сначала нужно добавить несколько меток к вашему графику, что в вашем случае вы бы сделали внутри своих вызовов ax.plot()
. Я не уверен, что вы рисуете, поэтому не могу сказать, какие метки были бы разумными, но вам может понадобиться что-то вроде: ax.plot(... label=f'band {nbnd}' if nbnd < 4 else None)
.
Обратите внимание на встроенный if
. Вероятно, у вас будет целая куча черных полос, которые вы не хотите маркировать по отдельности, поэтому вы, вероятно, захотите пометить только первую и позволить остальным иметь label = None
, что означает отсутствие раздутой легенды.
3. Масштаб Y
Если вы измените способ итерации данных, вы сможете захватить набор данных h5 как нечто, что ведет себя очень похоже на массив numpy. Я имею в виду, что вам действительно нужны только два цикла для индексации нужных данных. freq[i, :, nbnd]
должен быть 1-мерным массивом, который вы хотите установить на y
. Вы можете умножить этот одномерный массив на какое-то scale
значение
4.
import h5py
import matplotlib.pyplot as plt
import warnings
import matplotlib
warnings.filterwarnings("ignore") # Ignore all warnings
cmap = matplotlib.cm.get_cmap('jet', 4)
ticklabels=['A','B','C','D','E']
params = {
'mathtext.default': 'regular',
'axes.linewidth': 1.2,
'axes.edgecolor': 'Black',
'font.family' : 'serif'
}
#get the viridis cmap with a resolution of 3
#apply a scale to the y axis. I'm just picking an arbritrary number here
scale = 10
offset = 0 #set this to a non-zero value if you want to have your lines offset in a waterfall style effect
plt.rcParams.update(params)
fig, ax = plt.subplots()
f = h5py.File('band.hdf5', 'r')
#print ('datasets are:')
print(list(f.keys()))
dist=f[u'distance']
freq=f[u'frequency']
kpt=f[u'path']
lbl = {0:'AB', 1:'BC', 2:'CD', 3:'fourth'}
for i, section in enumerate(dist):
for nbnd, _ in enumerate(freq[i][0]):
x = section # to_list() you may need to convert sample to list.
y = (freq[i, :, nbnd] + offset*nbnd) * scale
if (nbnd<3):
color=f'C{nbnd}'
else:
color='black'
ax.plot(x, y, c=color, lw=2.0, alpha=0.8, label = lbl[nbnd] if nbnd < 3 and i == 0 else None)
ax.legend()
# Labels and axis limit and ticks
ax.set_ylabel(r'Frequency (THz)', fontsize=12)
ax.set_xlabel(r'Wave Vector (q)', fontsize=12)
ax.set_xlim([dist[0][0],dist[len(dist)-1][-1]])
xticks=[dist[i][0] for i in range(len(dist))]
xticks.append(dist[len(dist)-1][-1])
ax.set_xticks(xticks)
ax.set_xticklabels(ticklabels)
# Plot grid
ax.grid(which='major', axis='x', c='green', lw=2.5, linestyle='--', alpha=0.8)
# Save to pdf
plt.savefig('plots.pdf', bbox_inches='tight')
Этот сценарий дает мне следующее изображение с предоставленными вами данными