Seite 1 von 1
Tausenderpunkt an y-Achse
Verfasst: Montag 22. August 2022, 07:58
von Alex_Ing
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:
Wäre ja auch zu einfach gewesen. Vielleich hat jemand eine Idee?

Re: Tausenderpunkt an y-Achse
Verfasst: Montag 22. August 2022, 09:33
von __blackjack__
@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.
Re: Tausenderpunkt an y-Achse
Verfasst: Montag 22. August 2022, 09:39
von Sirius3
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
Re: Tausenderpunkt an y-Achse
Verfasst: Montag 22. August 2022, 10:09
von __blackjack__
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'
Re: Tausenderpunkt an y-Achse
Verfasst: Mittwoch 24. August 2022, 07:34
von Alex_Ing
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(",",".")))