2016-01-28 66 views
2

查看季節性數據時,我喜歡使用一次顯示幾年數據的圖表,以1月至12月的月份x軸和y軸上的值,使用顏色來區分年份。下面的圖表使用ggplot2R中創建。如何在Plotly中使用Python API複製它或生成非常相似的東西?如何繪製圖表,將年份映射爲x軸上的線條顏色和月份

ggplot2 chart

到目前爲止, 「最好的」 我這樣做是這樣的:

Plotly

...這顯然不會做的工作。理想情況下,我希望能夠給出Plotly五年的數據(基本上是年份提供的類別)與一兩個或三個或五個顏色的數組,並讓它自動映射每年的顏色,而不必手動指定單個顏色本身。基本上我不明白Plotly的顏色映射機制到了那裏。

代號爲Python的例子:

import plotly.plotly as py 
import plotly.graph_objs as go 
import pandas as pd 
import numpy as np 

py.sign_in('xxx','xxx') 

np.random.seed(123456) 
num_periods=24 
monthindex=pd.date_range('1/1/2014', periods=num_periods, freq='MS') 
dd = pd.DataFrame(data={'date':monthindex, 
         'c1': np.random.uniform(10, 20, size=num_periods), 
         'c2': np.random.uniform(30, 40, size=num_periods)}, 
        index=monthindex, 
) 
dd['year'] = dd['date'].dt.year 
dd['monthname'] = dd['date'].dt.strftime('%b') 

outdata = [ 
    go.Scatter(
     x=dd['monthname'], # assign x as the dataframe column 'x' 
     y=dd['c1'], 
    ) 
] 

layout = go.Layout(
    showlegend=True, 
    title="'Stacking' years in plotly", 
    xaxis=dict(
     type='category' 
    ) 
) 

代碼的R例如:

library(ggplot2) 

dd <- data.frame(date = seq(as.Date("2014/1/1"), 
        by = "month", 
        length.out = 24), 
       c1 = runif(24, min = 10, max = 20)) 

dd$month <- as.integer(strftime(dd$date, "%m")) 
dd$year <- strftime(dd$date, "%Y") 

xscale <- data.frame(breaks = c(1,2,3,4,5,6,7,8,9,10,11,12), 
        labels = c('Jan','Feb','Mar','Apr', 
         'May','Jun','Jul','Aug','Sep', 
         'Oct','Nov','Dec')) 


ggplot(dd, aes(month, c1)) + 
    geom_line(aes(colour = factor(year))) + 
     scale_x_continuous(breaks = xscale$breaks, 
          labels = xscale$labels) + 
      scale_colour_manual("year",values=c("Red","Blue")) + 
       ggtitle("'Stacking' years in ggplot2") 

回答

3

我最近剛學做各種不同的痕跡我要繪製成一個數據幀列的模式:

dd = dd.pivot_table('c1', 'monthname', 'year') 
py.iplot([{ 
    'x': dd.index, 
    'y': dd[col], 
    'name': col 
} for col in dd.columns]) 

上面的代碼很方便快速繪圖,但如果你想改變th e默認佈局設置,您可以使用下面的更詳細的版本。更多示例,請查看https://plot.ly/python/line-and-scatter/#Style-Scatter-Plots

import plotly.plotly as py 
import plotly.graph_objs as go 

my_data = [{ 
    'x': dd.index, 
    'y': dd[col], 
    'name': col 
} for col in dd.columns] 

my_layout = {'title':'my graphtitle', 
      'xaxis':{'title':'x axis title'}, 
      'yaxis':{'title':'y axis title') 
     } 
fig = go.Figure(data=my_data, layout=my_layout) 
py.iplot(fig, filename='scatter_plot') 

enter image description here

或者,可以使用cufflinks庫,提供了一種用於大熊貓dataframes一個簡單的繪圖鉤:

import cufflinks 
dd = dd.pivot_table('c1', 'monthname', 'year') 
dd.iplot() 

cufflinks神奇地給出大熊貓dataframes(以及其他對象)的.iplot()方法。退房https://plot.ly/ipython-notebooks/cufflinks/https://plot.ly/pandas/

+0

謝謝你讓我意識到這一點。我對這個庫很陌生,所以我很難判斷你的代碼是否實際上使用'plotly'或者它是否使用另一個繪圖庫;是'plotly'的'iplot'部分? – SlowLearner

+0

是的,它使用'plotly'庫。第一個例子僅依賴於「plotly」進行繪圖,而第二個例子使用「cufflinks」模塊將「pandas」和「plotly」神奇地綁在一起。 – elsherbini

+0

你可以在第一個例子中用'plot'替換'iplot'。 'iplot'用於在ipython筆記本上內聯繪圖。 – elsherbini