MatplotLib uniforme Farben

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
SuchtyTV
User
Beiträge: 4
Registriert: Samstag 6. Juli 2019, 12:11

Hey wenn ich dieses Skript ausführe:

Code: Alles auswählen

'''
==============
3D scatterplot
==============

Demonstration of a basic scatterplot in 3D.
'''

# This import registers the 3D projection, but is otherwise unused.
from mpl_toolkits.mplot3d import Axes3D  # noqa: F401 unused import

import matplotlib.pyplot as plt
import numpy as np

# Fixing random state for reproducibility


def randrange(n, vmin, vmax):
    '''
    Helper function to make an array of random numbers having shape (n, )
    with each number distributed Uniform(vmin, vmax).
    '''
    return (vmax - vmin)*np.random.rand(n) + vmin

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

n = 100

# For each set of style and range settings, plot n random points in the box
# defined by x in [23, 32], y in [0, 100], z in [zlow, zhigh].
for m, zlow, zhigh in [('o', -50, -25), ('^', -30, -5)]:
    xs = randrange(n, 23, 32)
    ys = randrange(n, 0, 100)
    zs = randrange(n, zlow, zhigh)
    ax.scatter(xs, ys, zs, marker=m)

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

plt.show()
Erhalte ich uniforme Farben.
Wenn ich dieses ausführe (autogeneriert):

Code: Alles auswählen

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
points =  [
(1.2,5,6),
(1.2,7,6),
(1.2,5,6),
(1.2,8,6),
(7,8,5),
(5,7,6),
(1,2,3),
(4,5,6),
(2,1,1),
]
rectangle =  [
((1,1,1),(2,2,2),(1,3,4)),
((2,3,4),(9,9,9),(3,4,5)),
]
for val in points:
  (x,y,z) = val
  ax.scatter(x, y, z, marker='o')
plt.show()
nicht. Was muss ich tuen, damit ich uniforme Farben erhalte? Was ist in dem obigen Skript anders?

Vielen Danl :lol:
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SuchtyTV: Für jeden Aufruf von `scatter()` sucht sich `matplotlib` eine neue Farbe aus. Im ersten Skript wird `scatter()` zweimal aufgerufen, im zweiten wird es 9× aufgerufen, für jeden Punkt einmal. Also erstelle Listen mit allen Werten für `x`, `y`, und `z` und rufe `scatter()` damit dann *ein*mal auf. Und schon haben alle Punkte die gleiche Farbe.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
SuchtyTV
User
Beiträge: 4
Registriert: Samstag 6. Juli 2019, 12:11

Wie ich Python als funktionale Programmier- und dynamische Typsprache hasse -.- Eine Liste darf auch in die Funktion...
Vielen Dank für deine Antwort :)
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SuchtyTV: Das ist jetzt aber nichts was man nicht auch in einer statisch typisierten Programmiersprache hinbekommen würde in dem man die Methode/Funktion überlädt. Wobei meine Reaktion eher umgekehrt ist: Ich bin mehr verwundert darüber das man auch Einzelwerte angeben kann, denn normal sind für mich an der Stelle Sequenzen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
SuchtyTV
User
Beiträge: 4
Registriert: Samstag 6. Juli 2019, 12:11

Ja schon, aber bei statisch typisierten Sprachen gibt es dafür scheinbar besser dokumentierte Wikis... Wenn ich Pythonwikis lese, versteh ich immer nur Bahnhof... :lol: Liegt wohl an mir.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@SuchtyTV: Was für Wikis? Ich würde ja in die Dokumentation schauen von dem was man da benutzt. Die Argumente heissen `xs`, `ys`, und `zs` was auch auf Sequenzen hindeutet, und dann hast Du da das erste Beispiel in dem sehr eindeutig Arrays für jedes der drei Argumente übergeben werden.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten