Topic: Tickness variabile matplotlib  (Letto 189 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline slucky

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Tickness variabile matplotlib
« il: Aprile 27, 2018, 13:35 »
Ciao a tutti!
Avrei bisogno del vostro aiuto per regolare la "tickness" di un grafico, realizzato con matplotlib.
Vorrei, sull' asse delle x, che la spaziatura tra 0-1 sia maggiore della spaziatura tra 1-2, che sia maggiore a sua volta della spaziatura tra 2-3 e così via. Un esempio pratico di ciò che intendo si può vedere in https://www.aanda.org/articles/aa/full/2008/06/aa8207-07/img113.gif . Questo tipo di spaziatura si utilizza in cosmologia perchè tra z=0 e z=1 si hanno molti più dati osservativi che tra z=1 e z=2 e così via...
Oltretutto, vorrei applicare tale spaziatura non solo a un normale grafico, ma anche a un grafico di tipo "bar".
Qualcuno ha idee o codici in proposito?
Ah, aggiungo due cose; non mi dite di andare a vedere matplotlib.pyplot.xticks, perchè io vorrei che la spaziatura mantenesse un legame con i dati; utilizzando semplicemente xticks credo che tale legame non sarebbe mantenuto. Penso di aver bisogno più di qualcosa tipo https://matplotlib.org/gallery/scales/custom_scale.html#sphx-glr-gallery-scales-custom-scale-py, ma purtroppo sono ancora troppo inesperta per arrivare a scrivere un codice del genere. L'unica cosa che ho capito è che l'asse x di cui ho bisogno scala circa come x^(0.56).
Grazie!
Slucky

Offline bebo

  • python erectus
  • ***
  • Post: 179
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Tickness variabile matplotlib
« Risposta #1 il: Aprile 27, 2018, 20:17 »
 Cosa sei riuscita a fare finora? Prendendo quell'esempio dalla "doc" di matplotlib, cosa riesci a fare? (se posti codice, usa il tasto "pythoncode" per formattarlo. e posta un esempio coinciso al problema che non riesci a risolvere)

Offline slucky

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Tickness variabile matplotlib
« Risposta #2 il: Aprile 30, 2018, 11:27 »
fin'ora ho fatto questo, ma se cambio un po' i gli estremi dell'asse x, mi sballa un po' a livello grafico...tipo lo zero se ne va fuori dall'asse x..

class SquareRootScale(mscale.ScaleBase):
    """
    ScaleBase class for generating square root scale.
    """

    name = 'squareroot'

    def __init__(self, axis, **kwargs):
        mscale.ScaleBase.__init__(self)

    def set_default_locators_and_formatters(self, axis):
        axis.set_major_locator(ticker.AutoLocator())
        axis.set_major_formatter(ticker.ScalarFormatter())
        axis.set_minor_locator(ticker.NullLocator())
        axis.set_minor_formatter(ticker.NullFormatter())

    def limit_range_for_scale(self, vmin, vmax, minpos):
        return  max(0., vmin), vmax

    class SquareRootTransform(mtransforms.Transform):
        input_dims = 1
        output_dims = 1
        is_separable = True

        def transform_non_affine(self, a):
            return np.array(a)**0.5

        def inverted(self):
            return SquareRootScale.InvertedSquareRootTransform()

    class InvertedSquareRootTransform(mtransforms.Transform):
        input_dims = 1
        output_dims = 1
        is_separable = True

        def transform(self, a):
            return np.array(a)**2

        def inverted(self):
            return SquareRootScale.SquareRootTransform()

    def get_transform(self):
        return self.SquareRootTransform()

mscale.register_scale(SquareRootScale)

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6), tight_layout=True)
ax1.set_title('number density passive vs z',fontsize=10)
ax1.bar(z, count, 0.1 , color='r')
ax1.set_xscale('squareroot')
ax1.set_xticks(np.arange(0,9,1))
ax1.set_xticks(np.arange(0,8,0.2), minor=True)


Offline bebo

  • python erectus
  • ***
  • Post: 179
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Tickness variabile matplotlib
« Risposta #3 il: Maggio 01, 2018, 22:30 »
Non posso provare il tuo esempio, mancano degli import, mancano le variabili z, count, etc.

Offline slucky

  • python unicellularis
  • *
  • Post: 3
  • Punti reputazione: 0
    • Mostra profilo
Re:Tickness variabile matplotlib
« Risposta #4 il: Maggio 04, 2018, 12:05 »
hai ragione, scusami

import matplotlib.scale as mscale
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
import matplotlib.ticker as ticker
import numpy as np
import random

numcas=[random.randint(1,100) for i in range(1000)]
count,z=np.histogram(numcas, bins=10)
z = z[:-1] + (z[1] -z[0]) #bins


Offline bebo

  • python erectus
  • ***
  • Post: 179
  • Punti reputazione: 0
    • Mostra profilo
    • bebo_sudo's personal homepage
Re:Tickness variabile matplotlib
« Risposta #5 il: Maggio 05, 2018, 12:19 »
Dopo aver fatto taglia e cuci con gli import che hai passato, ho lanciato il tuo esempio minimale, ma non esce niente.. ma hai provato a farlo girare?