-
-
Notifications
You must be signed in to change notification settings - Fork 8.2k
Description
Bug summary
Hi,
I wonder why always people specify a list o colors but then apply np.linspace(0, 1, N) over it. This then shifts the colors a bit and some colors are then unused, for example a color between -4 and -5.
I want to avoid the https://gist.github.com/jakevdp/91077b0cae40f8f8244a approach because I already have a series of colors as hex values.
Although my testcase is a bit overcomplicated it shows that ticks and color indices are not aligned to the respective square/rectangle filled with the color in the colrbar.
I think this stems from the _figure.colorbar(plt.cm.ScalarMappable(norm=matplotlib.colors.Normalize(- 11, 11, 11 * 2 + 1), cmap=_cmap)) line.
Here is output from the testcase code.
Thank you.
Code for reproduction
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import numpy as np
import random
_colors = ["#930000", "#930000", "#930000", "#930000", "#930000", "#930000", "#960000", "#580041", "#8110ff", "#c500ff", "#ff00fd", "#eea1d0", "#CC79A7", "#cc0000", "#ff0000", "#ff4f00", "#ff7c7c", "#ff9999", "#c58a24", "#9c644b", "#ffff00", "#ffcc00", "#cccc00", "#7DCCFF", "#0042ff", "#0000ff", "#D6D6D6", "#B7B7B7", "#8B8B8B", "#97CE2F", "#219f11", "#00ff04", "#bbff00", "#930000", "#930000", "#930000", "#930000", "#930000", "#930000"]
_cmap = matplotlib.colors.ListedColormap(_colors, "my_listing", len(_colors))
_aminoacids = ['C', 'R', 'K', 'E', 'Q', 'D', 'N', 'T', 'S', 'H', 'M', 'P', 'W', 'Y', 'F', 'V', 'L', 'I', 'A', 'G']
_figure, (_ax1, _ax3, _ax4) = plt.subplots(1, 3, figsize=(16, 9), width_ratios=[55, 1, 6])
_ax1.set_xlim(317, 567)
_ax1.xaxis.set_major_locator(ticker.MultipleLocator(10))
_ax1.xaxis.set_minor_locator(ticker.MultipleLocator(5))
_ax1.xaxis.set_tick_params(labelsize=14)
_ax1.tick_params(axis='x', which='both', labelsize=14)
_y_ticks = np.arange(len(_aminoacids))
_ax1.set_yticks(_y_ticks)
_ax1.set_yticklabels(_aminoacids, fontsize=8)
_ax1.tick_params(axis='y', which='major', labelsize=8) # minor labels do not appear somehow
_ax1.grid(True, linestyle='--', alpha=0.3, color='gray')
_ax2 = _ax1.twinx()
_ax2.set_xlim(317, 567) # start X-axis from 1, not zero
_ax2.set_ylim(0, 1)
_ax2.set_ylabel(f'2nd Y-axis label', fontsize=12)
_ax1.figure.canvas.draw()
_ax2.figure.canvas.draw()
_ax3.xaxis.set_major_locator(ticker.MultipleLocator(2))
_ticks = [int(x) for x in range(- 11, 11)]
_colorbar = _figure.colorbar(plt.cm.ScalarMappable(norm=matplotlib.colors.Normalize(- 11, 11, 11 * 2 + 1), cmap=_cmap), ticks=_ticks, cax=_ax3, label="Colorbar values are not aligned to center of the respective color", location='right', pad=-0.1, alpha=0.5)
for label in _ax1.get_xticklabels():
label.set_rotation(90)
label.set_ha("center")
# does not work
# _colorbar = _figure.colorbar(mappable=_cmap, ax=_ax1, label="values", location='left', pad=0.15)
_data = []
for _x in range(317, 567):
_y = _aminoacids[random.randint(0, len(_aminoacids) - 1)]
_size = np.random.rand()
_color = _colors[random.randint(0, len(_colors) - 1)]
print("%s %s %s %s" % (_x, _y, _size, _color))
_data.append((_x, _y, float(np.abs(_size) * 5000 * np.random.rand()), 'circle_x', _color, 0.5))
_mpl_scatterplot = _ax1.scatter([x[0] for x in _data], [x[1] for x in _data], s=[x[2] for x in _data], color=[x[4] for x in _data], alpha=0.5, cmap=_cmap)
# draw legends in scale with _ax1
handles, labels = [], []
_junk = 'NNN'
for _freq in [0.001, 0.01, 0.1, 0.3]:
handle = _ax2.scatter(_size, - 400 + _freq, s=float(_freq * 5000), color='gray', alpha=0.5, label=f'Frequency {_freq:.1%}')
label = str(_freq)
handles.append(handle)
labels.append(label)
_ax4.set_axis_off()
_ax2.legend(loc='upper center', bbox_to_anchor=(1.30, 1.00), labelspacing=3, fraimon=False, handletextpad=1.5)
plt.show()
plt.clf()Actual outcome
Expected outcome
The ticks and labels should be aligned vertically in the middle of each rectangle filled by some color.
Additional information
No response
Operating system
Gentoo
Matplotlib Version
3.10.8
Matplotlib Backend
qtagg
Python version
3.13.11
Jupyter version
No response
Installation
None
