Python Forum
matplotlib barh y tick alignment - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: matplotlib barh y tick alignment (/thread-349.html)



matplotlib barh y tick alignment - iFunKtion - Oct-06-2016

Hi,

Can't seem to get the y tick labels to line up nicely on the horizontal bar chart in this sub plotted chart (bottom chart). I have found various references to alignment but can't get anything to work, here is the code, the data is a simple two column delimited text file comprising of a name and a number from 1 to 6 delimited with a comma and no white space. The Second chart, the one in question, simply takes the total of all the values in the upper graph and adds them together, I hope it's fairly obvious:
#!/usr/bin/python3

# aniMat.py
# Testing out updating live charts with MatPlotLib library.

import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import style

style.use('ggplot')    # style sheet used as grid is handy troubleshooting info.

fig = plt.figure()
ax1 = plt.subplot2grid((8,1), (0,0), rowspan=3, colspan=1)
ax2 = plt.subplot2grid((8,1), (4,0), rowspan=1, colspan=1)
bar_width = 0.6

def animate(i):
    # Data is taken from simple two column text file of a string and an in
    # separated by a comma and no white space. String data is pulled into xar_labels
    # and an integer range has been generated for the initial x-axis.

    pullData = open('./data_sets/sample.txt', 'r').read()
    dataArray = pullData.split('\n')

    xar = []
    xar_labels = []
    yar = []
    xhar = [0, 1]
    yhar = [40, 0]
    t_used  = 0
    n = 0
    rflag = False
    aflag = False

    # rag refers to 'red', 'amber', 'green' status, color 'orange is used but label remains 'amber'
    # Chart is designed to quickly see if any one customer goes above the allocation.
    rag_array = []
    for eachLine in dataArray:
        if len(eachLine)>1:
            x, y = eachLine.split(',')
            xar_labels.append(str(x))
            xar.append(int(n))
            print(xar)
            print(xar_labels)
            yar.append(int(y))
            t_used = t_used + int(y)
            n = n + 1
            if int(y) < 4:
                rag = 'green'
            elif int(y) == 4:
                rag = 'orange'
                aflag = True
            else:
                rag = 'red'
                rflag = True
            rag_array.append(rag)

    ax1.clear()
    ax2.clear()
    ax1.bar(xar, yar, bar_width, align='center', color=rag_array)            # Put align parameter in here following matplotlib documentation examples
    ax1.set_xticks(xar, xar_labels)
    ax1.set_title('Tyres')
    ax1.set_ylim(0, 6)
    ax1.set_ylabel('Tyres Used')
    ax1.set_xlabel('VIN Number')
    
    yhar = [40, t_used]
    if rflag:
        rag_sets = 'red'
    elif aflag:
        rag_sets = 'orange'
    else:
        rag_sets = 'green'    
    ax2.barh(xhar, yhar, color=['grey', rag_sets])
    ax2.set_xlabel('Number of Sets')
    ax2.set_xlim(0, 50)
    ax2.set_ylim(0, 2)
  
ani = animation.FuncAnimation(fig,animate, interval=1000)
plt.show()
regards
iFunk


RE: matplotlib barh y tick alignment - Larz60+ - Oct-06-2016

And here's the post for Y axis:
http://stackoverflow.com/questions/23637219/center-align-tick-labels-of-matplotlib-heatmap


RE: matplotlib barh y tick alignment - iFunKtion - Oct-06-2016

Yes I found that, but it covers the x axis which is fine, not the y axis which is causing the problem, the tick marks line up to the top of the bar, not the middle of it and looks a bit strange.

Ok, I've found solved this/found workaround for this. It's not the most intuitive, but I reset the xticks to [0,1] instead of [0,2] with the view that having the tick labels below the bar on a horizontal chart would look better, and then the align parameter worked:
    ax2.barh(xhar, yhar, align='center', color=['grey', rag_sets])         # align parameter now works
    ax2.set_xlabel('Number of Sets')
    ax2.set_xlim(0, 50)
    ax2.set_yticks([0, 1])                                                                     # so long as the ticks are set in this way
    ax2.set_yticklabels(tyreStock)
iFunk