1

I have got a matplotlib question about xticks. I wanted to hide all those values that do not occur. I actually did it, but for the second set of values (red chart). I found how to hide for a specific data frame but not for 2 or more.

This is my code:

plt.subplots(figsize=(2, 1), dpi=400)
width = 0.005

xlim = np.arange(0, 1, 0.01)
ylim = np.arange(0, 0.1, 0.001)


plt.xticks(density_2.index.unique(), rotation=90, fontsize=1.5)
plt.yticks(density_2.unique(), fontsize=2)
plt.bar(density_1.index, density_1, width, color='Green', label=condition_1,alpha=0.5)
plt.bar(density_2.index, density_2, width, color='Red', label=condition_2,alpha=0.5)
plt.legend(loc="upper right", fontsize=2)
plt.show()

Link where I saw the solution: show dates in xticks only where value exist in plot chart and hide unnecessary interpolated xtick labels

Thank you very much in advance!

enter image description here

Zephyr
  • 11,891
  • 53
  • 45
  • 80
Ignacio Such
  • 129
  • 1
  • 8

1 Answers1

1

You need to find the intersection of the two lists of density_1's and density_2's ticks, as reported here.
Working example:

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

N = 150

values_1 = np.random.randint(low = 5, high = 75, size = N)/100
density_1 = pd.DataFrame({'density_1': values_1})
density_1 = density_1.value_counts().sort_index(ascending = True)
density_1.index = sorted(list(set(values_1)), reverse = False)

values_2 = np.random.randint(low = 35, high = 100, size = N)/100
density_2 = pd.DataFrame({'density_2': values_2})
density_2 = density_2.value_counts().sort_index(ascending = True)
density_2.index = sorted(list(set(values_2)), reverse = False)

width = 0.005
condition_1 = 'Adele'
condition_2 = 'Extremoduro'


fig, ax = plt.subplots(figsize = (10, 5))

ax.bar(density_1.index, density_1, width, color = 'Green', label = condition_1, alpha = 0.5)
ax.bar(density_2.index, density_2, width, color = 'Red', label = condition_2, alpha = 0.5)

ax.legend(loc = 'upper right')

ax.set_xticks(list(set(density_1.index.unique()) & set(density_2.index.unique())), rotation = 90)

plt.show()

In the line:

list(set(density_1.index.unique()) & set(density_2.index.unique()))

you can select ticks which blongs to both density_1 and density_2.

enter image description here

Zoom in:

enter image description here

Zephyr
  • 11,891
  • 53
  • 45
  • 80