2016-03-29 14 views
0

Ich versuche, ein 3D-Streudiagramm mit Matplotlib und Python zu erstellen. Das Problem sieht wie folgt aus: Der Offset für die Punkte auf einem 3D-Plot macht es unmöglich zu verstehen, wo genau diese gehören. Hier3D Streudiagramm ohne Offset mit Matplotlib

ist der Graph, der gebaut wurde: enter image description here

In diesem Diagramm beobachten, dass diese Punkte nicht genau mit den Eckpunkten zusammenfallen. Das heißt, gemäß dem Graphen zeigt es, dass ein Punkt irgendwo zwischen 0B und 1B und 4S existiert, der nicht in dem Datensatz enthalten ist (siehe Code MWE unten). Gibt es etwas, was getan werden muss, um den Offset einzustellen?

#!/usr/bin/env python 
import matplotlib.pyplot as plt 
from matplotlib.font_manager import FontProperties 
from mpl_toolkits.mplot3d import Axes3D 
import string 
from matplotlib import cm 
import matplotlib 

def plot_state_transition(): 
    xTickMarks = ["-1B","0B", "1B", "2B", "3B"]#, "4B"]#, "1B3S", "2B2S"] 
    yTickMarks = ["-1S","0S", "1S", "2S", "3S", "4S"] 
    zTickMarks = ["0", "0.6", "0.65", "0.9", "1.15"] 
    matplotlib.rc('font', serif='Helvetica Neue') 
    matplotlib.rc('text', usetex='false') 
    matplotlib.rcParams.update({'font.size': 10}) 

    fig = plt.figure(figsize=(11.69,4.88)) # for landscape 
    axes1 = fig.add_subplot(111, projection='3d') 
    savename = "state-transition.png" 

    tup = [] 
    plt.grid(True,linestyle='-',color='0.75') 
    X_AXIS = ['2B', '2B', '1B', '2B', '2B', '2B', '1B', '2B'] 
    Y_AXIS = ['0S', '2S', '3S', '2S', '2S', '2S', '3S', '2S'] 
    Z_AXIS = ['0.6', '0.6', '0.6', '0.6', '0.6', '0.9', '0.9', '0.9'] 
    s = [12.900648500000001, 12.705360163934426, 13.021028032786887, 13.258014354838707, 14.418979838709676, 17.092295806451613, 15.625246451612906, 17.484319354838711] 

    x = [xTickMarks.index(i) for i in X_AXIS] 
    y = [yTickMarks.index(i) for i in Y_AXIS] 
    z = [zTickMarks.index(i) for i in Z_AXIS] 
    s = s 

    axes1.scatter(x, y, z, c='r', marker='o') 

    axes1.set_xlim((0, len(xTickMarks)-1)) 
    axes1.set_ylim((0, len(yTickMarks)-1)) 
    axes1.set_zlim((0, len(zTickMarks)-1)) 

    axes1.set_xticks(xrange(len(xTickMarks))) 
    axes1.set_yticks(xrange(len(yTickMarks))) 
    axes1.set_zticks(xrange(len(zTickMarks))) 

    axes1.set_xticklabels(xTickMarks) 
    axes1.set_yticklabels(yTickMarks) 
    axes1.set_zticklabels(zTickMarks) 

    axes1.set_ylabel('Small cores') 
    axes1.set_zlabel('Frequency') 
    axes1.set_xlabel('Big cores') 

    axes1.xaxis.grid(True) 
    figsize=(11.69,8.27) # for landscape 
    fig.savefig(savepath + savename, bbox_inches='tight', dpi=300, pad_inches=0.1) 
    plt.clf() 


def main(): 
    plot_state_transition() 

if __name__ == "__main__": 
    main() 

Antwort

1

Ich glaube nicht, dass es etwas falsch mit der Handlung, mit der Ausnahme, dass es versucht, 3-dimensionale Informationen auf zwei Dimensionen zu präsentieren. Der Versuch der Perspektive (was es so aussehen lässt, als wäre es 3D) ist der Grund für den Offset. Sie können jeden Versatz beseitigen, indem Sie einfach den 3D-Effekt überspringen oder alternativ den "Kamerawinkel" auf dem Diagramm einstellen, sodass der Versatz reduziert oder eliminiert wird. Sie stellen den Kamerawinkel unter Verwendung von axes1.view_init(elev=x, azim=y) ein. Zum Beispiel Ihre Daten verwenden, sieht elev=10, azim=90 wie folgt aus:

5``

Und elev=-5, azim=0 sieht wie folgt aus: enter image description here

Sie können mit Blick spielen, um zu sehen, ob das hilft. Obwohl diese die Offsets ändern, wird dadurch das Problem nicht vollständig beseitigt, da es sich um die 3D-Natur dieser Diagramme handelt.

+0

Das macht sehr viel Sinn. Ich werde versuchen, durch verschiedene Blickwinkel zu laufen und dann sehen. Vielen Dank. – tandem

+0

Wenn ich 3D-Plots mache, animiere ich oft die Handlung durch eine große Auswahl von Ansichten, z. von -90 bis 90 um 2 Schritte. Das bringt die "3Dness" wirklich heraus und reduziert das Problem der perspektivischen Offsets erheblich. Natürlich ist das nicht gut, wenn Sie auf dem Papier veröffentlichen, aber Web-Publishing und so weiter kann gut damit arbeiten, z. verwandel es in ein gif – iayork

+0

Aber, wie verwandelst du es in ein gif? Kannst du ein Beispiel geben ? – tandem

Verwandte Themen