Как построить два файла case1.hdf5 и case2.hdf5 в matplotlib. Обращение за помощью для исправления сценария - PullRequest
0 голосов
/ 30 мая 2020

У меня есть сценарий ниже, который отображает только case1.hdf5 файл.

  • Я хочу построить еще один case2.hdf5 файл в том же сценарии, чтобы я получил два перекрывающихся графика.

Кроме того, я хочу использовать

  1. шрифт Times New Roman для меток и заголовков.
  2. Вставить легенды для обоих графиков.
  3. Умножить ось Y данные с некоторым постоянным номером.
  4. Этот скрипт дает три нижних строки одного цвета, но я хочу, чтобы все три были разных цветов solid для case1.hdf5 и с одинаковым цветом и пунктиром для другого файла case2.hdf5.

Мой сценарий здесь

import h5py
import matplotlib.pyplot as plt 
import warnings
import matplotlib

warnings.filterwarnings("ignore") # Ignore all warnings


ticklabels=[r'$\Gamma$','F','Q','Z',r'$\Gamma$']

params = {
'mathtext.default': 'regular',
'axes.linewidth': 1.2,
'axes.edgecolor': 'Black',
}

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']

# Iterate over each segment
for i in range(len(dist)):
# Iteraton over each band
    for nbnd in range(len(freq[i][0])):
        x=[]
        y=[]

        for j in range(len(dist[i])):
            x.append(dist[i][j])
            y.append(freq[i][j][nbnd])
# First 3 bands are red
        if (nbnd<3):
            color='red'
        else:
            color='black'

        ax.plot(x, y, c=color, lw=2.0, alpha=0.8)

# 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')

Видите ли, есть

Первые 3 полосы красные

    if (nbnd<3):
        color='red'

и вместо красный Я хочу, чтобы все эти три были solid разных цветов и для case2.hdf5 пунктирными линиями с одинаковыми цветами.

1 Ответ

2 голосов
/ 30 мая 2020

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')

Этот сценарий дает мне следующее изображение с предоставленными вами данными ![enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...