0 votes
1 view
in Python by (6.1k points)

I am trying to plot some data using matplotlib. The problem is when I am using plt.xtick() function it gives me following.

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

Below is the code error is at line no 60 "plt.xticks(np.array([r + barWidth for r in range(len(ener))]), xlab, rotation=90)"

import numpy as np

from mpl_toolkits.mplot3d import axes3d

import matplotlib.pyplot as plt

import matplotlib.tri as tri

from matplotlib.ticker import MaxNLocator

import math

import os, pdb

paths=["1leo_5fpps_pwat", "1leo_5fpps_u8", "1leo_5fpps_u8_t4"]

aminoacids = {1:"Ser1", 2:"trp2", 3:"thr3", 4:"trp4", 5:"glu5", 6:"gly6", 7:"asn7", 8:"lys8", 9:"trp9", 10:"thr10", 11:"trp11", 12:"lys12"}

np.set_printoptions(suppress=True)

replica=0

f, ax = plt.subplots(3, figsize=(15,10), sharex=True)

for i in range(3):

    xf=np.random.rand(6000, 199)

    Z = np.mean(xf, axis=0)

    # set width of bar

    barWidth = 0.25

    # set height of bar

    ener = Z[1::3]

    vdw = Z[2::3]

    elec = Z[3::3]

    filtered_index=np.where(ener<25)

    ener = ener[filtered_index]

    vdw = vdw[filtered_index]

    elec = elec[filtered_index]

    ax[i].set_title(paths[i])

    # print(Z.shape, ener.shape, vdw.shape, elec.shape)

    # print("Z\n", Z)

    print("vdw\n", vdw)

    print("electrostatic\n", elec)

    print("Total\n", ener)

    print("sum\n",vdw+elec)

    # Set position of bar on X axis

    r1 = np.arange(len(ener))

    r2 = [x + barWidth for x in r1]

    r3 = [x + barWidth for x in r2]

    # Make the plot

    ax[i].bar(r1, ener, color='red', width=barWidth, edgecolor='white', label='ener')

    ax[i].bar(r2, vdw, color='green', width=barWidth, edgecolor='white', label='vdw')

    ax[i].bar(r3, elec, color='blue', width=barWidth, edgecolor='white', label='elec')

    ax[i].legend()

    xlab = np.array([(i,j) for i in range(1,13) for j in range(i+1,13)])

    xlab = xlab[filtered_index]

    xlab = np.array([[aminoacids[i], aminoacids[j]] for i,j in xlab])

pdb.set_trace()

f.suptitle('Interaction energy of Trp-zipper replica {}'.format(replica), fontsize=16)

f.text(0.5, 0.02, 'Native contacts', ha='center', fontsize=16)

f.text(0.08, 0.5, "Energy (kcal/mol)", va='center', rotation='vertical', fontsize=16)

f.subplots_adjust(hspace=0.25)

plt.xticks(np.array([r + barWidth for r in range(len(ener))]), xlab, rotation=90)

plt.setp([a.get_xticklabels() for a in f.axes[:-2]], visible=False)

plt.ion()

plt.show()

# plt.savefig("{}/plots/inter_ener_trpzip_{}.png".format(os.environ["root"], replica), bbox_inches='tight')

# plt.pause(5.0)

# plt.show()

few months back this was working but now it is giving me error. I dont know why xtick gives the above error.

1 Answer

0 votes
by (12.1k points)

The problem here is that plt.xticks(A, B) expects B to be a list of strings, But you are passing a numpy array of dimensions (66, 2) so we join the 2 elements with ''.join() and then iterate over the 66 items using list comprehensions. Like this

plt.xticks(np.array([r + barWidth for r in range(len(ener))]),[ ''.join(x) for x in xlab] , rotation=90)

...