2017-10-07 98 views
0

我想做一個z軸散點圖使用cufflinkplotlypandas的包裝庫。我注意到iplotz參數,但我無法得到它的工作。袖釦模塊的陰謀不顯示z軸的散點圖

from plotly.offline import init_notebook_mode, iplot 
import plotly.graph_objs as go 
init_notebook_mode() 

import cufflinks as cf 
cf.go_offline() 

df = cf.datagen.lines(3,columns=['a','b','c']) 

df.iplot(x='a', y='b', z='c', kind='scatter', mode='markers') 

但是不顯示z軸。

enter image description here

回答

0

我只是想出了在看的z參數不與kind=scatter爲kwarg考慮的源代碼。

我很高興與大家分享一個解決方案,我發現我的需求使用情節。如果有人設法找到更快捷的袖釦解決方案,我會非常高興,否則這個人會做這項工作。它也有優點,顯示時間尺度正確

import pandas as pd 
import plotly.graph_objs as go 
from plotly.offline import iplot 


def py_scatter_by_z(x, y, z=None, x_title=None, y_title=None, mode='markers', colorscale='Jet', showscale=True, size=10, 
        line_color='black', 
        line_width=1, date_format="%b'%y", n_ticks=8, opacity=.5, scatter_kwargs=dict(), **layout_kwargs): 
    ''' 
    Plots a scatter plot between two variables x and y and colors each point according to a variable z. 

    Plotly and genereralized version of plot_scatter_by_time. 

    Args: 
     x (1D-Series | list | 1-D Array): values of x-axis. 
     y (1D-Series | list | 1-D Array): values of y-axis. 
     z (1D-Series | list | 1-D Array): values of z-axis used for colorscale. Could be Numeric or dates. 
     x_title (str): label of x_axis. 
     y_title (str): label of y_axis. 
     mode (str): Scatter mode, i.e. "markers" or "lines+markers". Default is markers 
     colorscale (str): Colorscale to use to color the points. 
        See plotly colorscale/matplotlib colormap. 
        Default is "Jet". 
     showscale (bool): Show colorbar if True (default). 
     size (int): size of the markers. Default is 10. 
     line_color (str): color of edge line of markers. Default is "black". 
     line_width (int): width of edge line of markers. Default is 1. 
     date_format (str): format of the 
     n_ticks (int): Number of ticks to display in the colorbar. 
     opacity (float between 0 and 1): opacity/transparency of filled markers. Default is 0.5. 
     scatter_kwargs (dict): dictionary passed as kwargs for scatter. Default is empty dictionary. 
     **layout_kwargs: kwargs of the function, used as layout kwargs. 

    Returns: dictionary representing a plotly figure. 

    ''' 

    # Basic trace 
    trace = go.Scatter(
     x=x, 
     y=y, 
     mode=mode, 
    ) 

    layout = go.Layout(xaxis=dict(title=x_title), yaxis=dict(title=y_title)) 
    layout.update(**layout_kwargs) 

    # Coloring points 
    if z is not None: 
     z_all_dates = pd.Series(index=z).index.is_all_dates 

     if z_all_dates: 
      # Special treatment if z is a datetime vector 
      color = pd.to_numeric(z) 
      step = int(len(z)/n_ticks) 
      z = list(z) 
      ticktext = [date.strftime(date_format) for date in z[1::step]] 
      tickvals = list(color)[1::step] 
      colorbar = dict(nticks=n_ticks, 
          tickvals=tickvals, 
          ticktext=ticktext) 
     else: 
      color = z 
      colorbar = dict() 

     marker = {'marker': dict(size=size, color=color, colorscale=colorscale, 
           showscale=showscale, opacity=opacity, colorbar=colorbar)} 
     trace.update({'text': z}) 

    else: 
     marker = {'marker': dict(size=size)} 

    # Construct and plot figure 
    marker['marker'].update({'line': {'color': line_color, 'width': line_width}}) 
    trace.update(marker) 
    trace.update(**scatter_kwargs) 
    data = [trace] 
    fig = go.Figure(data=data, layout=layout) 
    iplot(fig) 

    return fig 


from plotly.offline import init_notebook_mode, iplot 
import plotly.graph_objs as go 
init_notebook_mode() 

import cufflinks as cf 
cf.go_offline() 

df = cf.datagen.lines(3,columns=['a','b','c']) 
df.index = pd.to_datetime(df.index) # Example with a time scale 
py_scatter_by_z(df['a'], df['b'], df.index) 

enter image description here

1

散點圖僅具有x和y軸。設置kindscatter3d增加了z軸。

from plotly.offline import init_notebook_mode, iplot 
import plotly.graph_objs as go 
init_notebook_mode() 

import cufflinks as cf 
cf.go_offline() 

df = cf.datagen.lines(3,columns=['a','b','c']) 

df.iplot(x='a', y='b', z='c', kind='scatter3d', mode='markers') 

enter image description here

如果您要在第三維添加到您的情節,你也可以用散點圖和信息添加到你的顏色。在這種情況下,不容易使用袖釦。

import plotly 
plotly.offline.init_notebook_mode() 
import cufflinks as cf 
cf.go_offline() 

df = cf.datagen.lines(3, columns=['a','b','c']) 
trace1 = plotly.graph_objs.Scatter(x=df.a, 
            y=df.b, 
            marker=dict(color=df.c, 
               showscale=True), 
            mode='markers') 
fig = plotly.graph_objs.Figure(data=[trace1]) 
plotly.offline.iplot(fig) 

enter image description here

+0

謝謝您的回答,問題是,3D繪圖不適合我的需要。我在回答中詳細說明了我通過使用z尺度分散的結果。它更像一個熱圖,但沒有醜陋的方塊。 – MCMZL

+0

@MCMZL:查看替代解決方案的更新答案。 –