4

I am trying to get the values for red dots (for values of 'y2') to plot to the left of the dots. I'm using ha='left' but to no avail. I tried the following two aproaches:

for a,b in zip(ind, y2):
    plt.text(a, b, str(b), fontsize=14, color='black', va='center', ha='left)

#OR:
for i, text in enumerate(y2):
    ax.annotate(str(text), (ind[i],y2[i]), ha='left')

Here is the code in its entirety:

import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
df0=pd.read_csv('sample1.csv')

import matplotlib.pyplot as plt

# You typically want your plot to be ~1.33x wider than tall.
# Common sizes: (10, 7.5) and (12, 9)
fig, ax = plt.subplots(1, 1, figsize=(12, 9))
plt.xticks(ind, x_axis, fontsize=14)
#Set y-axis font size
plt.yticks(fontsize=12)
x_axis = ['a','b','c']
y_axis = [2,8,10]

y2 = [3, 5, 9.5]

# Remove the plot frame lines. They are unnecessary here.
ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)

#0 = 'a', 1 = 'b, 2 = 'c'
ind = np.arange(len(x_axis))


#remove axis ticks save for left (y-axis):
plt.tick_params(
    axis='x',          # changes apply to the x-axis
    which='both',      # both major and minor ticks are affected
    bottom='off',      # ticks along the bottom edge are off
    top='off')         # ticks along the top edge are off


plt.tick_params(
    axis='y',          # changes apply to the x-axis
    which='both',      # both major and minor ticks are affected
    right='off')

plt.title('Super Awesome Title Goes Here\n'
          'and Is Continued Here', fontsize=18, va='center')
#Plot dots, cyan circles, no edges, transparency = 0.7 (1 is opaque))
# larger circles
plt.plot(ind, y_axis, 'co', markeredgecolor='none', alpha=1, markersize=40)
#plt.axis(0,10,0,3)

plt.plot(ind, y2, 'ro', markeredgecolor='none', alpha=.7, markersize=40)

#a and b are "where" to plot the label, str(b) is what to plot for the label
#add spaces to put label to the right
for a,b in zip(ind, y_axis):
    plt.text(a, b, "     "+str(b), fontsize=14, color='black', va='center')

for a,b in zip(ind, y2):
    plt.text(a, b, str(b), fontsize=14, color='black', va='center', ha='left')

    #Cell padding between categories
plt.xlim([min(ind) - 0.25, max(ind) + 0.25])
plt.ylim([0, max(y_axis) + 2])
plt.show()
1
  • 1
    Instead of adding the text at the exact x values (ind in your code above, try adding them at something like ind - 0.1 with ha kwarg set to right as suggested by ali_m. That way you can directly control the distance between your plot marker and the text you display. Commented Nov 12, 2015 at 13:25

1 Answer 1

14

The ha and va arguments specify which edges of the text bounding box will be aligned to the specified x,y coordinates. If you want your text to appear to the left of your dot, you need to align it according to the right hand edge of the bounding box:

from matplotlib import pyplot as  plt

fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.plot(0, 0, '+', ms=60)
ax.text(0, 0, 'align by top right corner', ha='right', va='top', fontsize=22)
ax.text(0, 0, 'align by bottom left corner', ha='left', va='bottom', fontsize=22)
ax.set_axis_off()
plt.show()

enter image description here

Sign up to request clarification or add additional context in comments.

3 Comments

Thank you both for the most helpful responses. By the way, is one method better than the other (for a, b in zip... vs. for i, text in enumerate) for what I'm trying to do?
In this case your enumerate version can be simplified to for a, b in enumerate(y2): ... ax.text(a, b, str(b)), since b will yield consecutive elements from y2 and a will be their corresponding indices. In general I think it's more Pythonic to use zip to iterate over multiple sequences rather than using explicit indexing, although this is mostly a stylistic preference.
annotate offers much more power and flexibility in terms of the style and placement than text, which comes at the price of greater complexity (I always end up having to check the docs in order to remember how to use it...)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.