Tausenderpunkt an y-Achse

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Alex_Ing
User
Beiträge: 4
Registriert: Dienstag 19. Juli 2022, 09:19

Hallo zusammen,

nach vielem Googlen und Ausprobieren stelle ich meine Frage nun doch hier.
Es ist eigentlich recht simpel. Ich habe einen Plot mit sehr hohen Werten bis zu 1.000.000 auf der y-Achse. Ich habe eine Funktion gefunden, die Kommas als Tausendertrennzeichen setzt. Mit einem Punkt an derselben Stelle funktioniert das nicht, wäre mir aber natürlich lieber. Auch replace und locale und andere Dinge habe ich mir angeschaut. Ich kann sie aber nicht auf einen Plot anwenden.
Hier die Zeile, die mir die Tausender-Trennzeichen setzt:

Code: Alles auswählen

ax.yaxis.set_major_formatter(
        ticker.FuncFormatter(lambda x, p: format(int(x), ',')))
Ersetze ich einfach das Komma durch einen Punkt, kommt folgende Fehlermeldung:

Code: Alles auswählen

ValueError: Format specifier missing precision
Wäre ja auch zu einfach gewesen. Vielleich hat jemand eine Idee? :)
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Alex_Ing: Ausgehend von dem was Du zeigst, wäre das einfachste die Komma-Tausendertrenner durch Punkte zu ersetzen. Also nicht das Komma bei `format()` sondern die Punkte im Ergebnis von `format()` beziehungsweise einer f-Zeichenkette:

Code: Alles auswählen

In [115]: x
Out[115]: 1234567890.42

In [116]: f"{int(x):,}"
Out[116]: '1,234,567,890'

In [117]: f"{int(x):,}".replace(",", ".")
Out[117]: '1.234.567.890'
Mit `locale.format_string()` geht das aber auch.

Und man könnte noch mit Kanonen auf Spatzen schiessen und das externe Babel-Package verwenden.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei mir funktioniert das mit der passenden Locale-Einstellung ohne Probleme:

Code: Alles auswählen

locale.setlocale(locale.LC_ALL, 'de_DE')
v = 2439574398574389
print(f"{v:n}")
# 2.439.574.398.574.389
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was mich an `locale` stört ist, dass die Zeichenketten zur Auswahl nicht portabel sind, also "de_DE" auf anderen Systemen anders heissen kann, und im Grunde nur die leere Zeichenkette ”sicher” ist um die Systemeinstellung zu verwenden. Womit das Ergebnis dann nicht mehr sicher reproduzierbar ist, weil es dann von den Systemeinstellungen abhängt welche Locale damit gesetzt wird.

Code: Alles auswählen

In [135]: locale.setlocale(locale.LC_ALL, "de_DE")
---------------------------------------------------------------------------
Error                                     Traceback (most recent call last)
Input In [135], in <cell line: 1>()
----> 1 locale.setlocale(locale.LC_ALL, "de_DE")

File /usr/lib/python3.8/locale.py:608, in setlocale(category, locale)
    605 if locale and not isinstance(locale, _builtin_str):
    606     # convert to string
    607     locale = normalize(_build_localename(locale))
--> 608 return _setlocale(category, locale)

Error: unsupported locale setting

In [136]: locale.setlocale(locale.LC_ALL, "de_DE.UTF-8")
Out[136]: 'de_DE.UTF-8'
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Alex_Ing
User
Beiträge: 4
Registriert: Dienstag 19. Juli 2022, 09:19

Hallo,

ich war leider krank, deshalb die späte Antwort.
Danke für eure Beiträge. Ich versuche, es auf den Plot anzuwenden. Ich weiß noch nicht genau, wie ich die y-Ticks damit adressieren kann, aber ich probiere einfach etwas rum.

Update: Es hat mit der f-Zeichenkette problemlos geklappt, danke! Locale hab ich deswegen nicht mehr ausprobiert.

Hier die aktualisierte Zeile im Code:

Code: Alles auswählen

ax.yaxis.set_major_formatter(
        ticker.FuncFormatter(lambda x, p: f"{int(x):,}".replace(",",".")))
Antworten