python - xticks - matplotlib title
Matplotlib: ¿Cómo forzar las etiquetas de ticks enteros? (2)
En base a una respuesta para modificar las etiquetas de tick, se me ocurrió una solución, no sé si funcionará en su caso ya que su fragmento de código no se puede ejecutar en sí mismo.
La idea es forzar a las etiquetas de marca a un espaciado de .5, luego reemplazar cada marca de .5 con su contraparte de entero, y otras con una cadena vacía.
import numpy
import matplotlib.pyplot as plt
fig, (ax1, ax2) = plt.subplots(1,2)
x1, x2 = 1, 5
y1, y2 = 3, 7
# first axis: ticks spaced at 0.5
ax1.plot([x1, x2], [y1, y2])
ax1.set_xticks(numpy.arange(x1-1, x2+1, 0.5))
ax1.set_yticks(numpy.arange(y1-1, y2+1, 0.5))
# second axis: tick labels will be replaced
ax2.plot([x1, x2], [y1, y2])
ax2.set_xticks(numpy.arange(x1-1, x2+1, 0.5))
ax2.set_yticks(numpy.arange(y1-1, y2+1, 0.5))
# We need to draw the canvas, otherwise the labels won''t be positioned and
# won''t have values yet.
fig.canvas.draw()
# new x ticks ''1''->'''', ''1.5''->''1'', ''2''->'''', ''2.5''->''2'' etc.
labels = [item.get_text() for item in ax2.get_xticklabels()]
new_labels = [ "%d" % int(float(l)) if ''.5'' in l else '''' for l in labels]
ax2.set_xticklabels(new_labels)
# new y ticks
labels = [item.get_text() for item in ax2.get_yticklabels()]
new_labels = [ "%d" % int(float(l)) if ''.5'' in l else '''' for l in labels]
ax2.set_yticklabels(new_labels)
fig.canvas.draw()
plt.show()
Si quieres alejarte mucho, necesitarás un poco de cuidado extra, ya que este produce un conjunto muy denso de etiquetas de tick.
Mi script en Python usa matplotlib para trazar un "mapa de calor" 2D de un conjunto de datos x, y, z. Mis valores de x e y representan residuos de aminoácidos en una proteína y, por lo tanto, solo pueden ser números enteros. Cuando me acerco a la trama, se ve así:
Como dije, los valores flotantes en los ejes xy no tienen sentido con mis datos y, por lo tanto, quiero que se vea así:
¿Alguna idea de cómo lograr esto? Este es el código que genera la trama:
def plotDistanceMap(self):
# Read on x,y,z
x = self.currentGraph[''xData'']
y = self.currentGraph[''yData'']
X, Y = numpy.meshgrid(x, y)
Z = self.currentGraph[''zData'']
# Define colormap
cmap = colors.ListedColormap([''blue'', ''green'', ''orange'', ''red''])
cmap.set_under(''white'')
cmap.set_over(''white'')
bounds = [1,15,50,80,100]
norm = colors.BoundaryNorm(bounds, cmap.N)
# Draw surface plot
img = self.axes.pcolor(X, Y, Z, cmap=cmap, norm=norm)
self.axes.set_xlim(x.min(), x.max())
self.axes.set_ylim(y.min(), y.max())
self.axes.set_xlabel(self.currentGraph[''xTitle''])
self.axes.set_ylabel(self.currentGraph[''yTitle''])
# Cosmetics
#matplotlib.rcParams.update({''font.size'': 12})
xminorLocator = MultipleLocator(10)
yminorLocator = MultipleLocator(10)
self.axes.xaxis.set_minor_locator(xminorLocator)
self.axes.yaxis.set_minor_locator(yminorLocator)
self.axes.tick_params(direction=''out'', length=6, width=1)
self.axes.tick_params(which=''minor'', direction=''out'', length=3, width=1)
self.axes.xaxis.labelpad = 15
self.axes.yaxis.labelpad = 15
# Draw colorbar
colorbar = self.figure.colorbar(img, boundaries = [0,1,15,50,80,100],
spacing = ''proportional'',
ticks = [15,50,80,100],
extend = ''both'')
colorbar.ax.set_xlabel(''Angstrom'')
colorbar.ax.xaxis.set_label_position(''top'')
colorbar.ax.xaxis.labelpad = 20
self.figure.tight_layout()
self.canvas.draw()
Esto debería ser más simple:
(de https://scivision.co/matplotlib-force-integer-labeling-of-axis/ )
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
#...
ax = plt.figure().gca()
#...
ax.xaxis.set_major_locator(MaxNLocator(integer=True))