2017-03-08 14 views
2

は私が試してみました15/10/2017matplotlibの3D散布図の日付

形式で日付のリストを持っているそれはエラーTypeError: ufunc 'sqrt' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

に投げ、それは2Dがある場合は示し

from matplotlib import pyplot 
import pandas as pd 

dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"] 
dates_formatted = [pd.to_datetime(d) for d in dates ] 
x = [1,2,3,4] 
z = [5,6,7,8] 

pyplot.scatter(x, dates_formatted, z) 
pyplot.show() 

次。例えばpyplot.scatter(x, dates_formatted)

は、私はまた、次の

ax = Axes3D(fig) 
ax = fig.add_subplot(111,projection='3d') 
ax.scatter(x, dates_formatted, y) 
pyplot.show() 

を試してみましたが、それはそれは座標系に文字列を変換する方法matplotlibを伝えるために、常に簡単ではないのですエラーにFloat() argument must be a string or number

+0

バックにそれらを置くことができます実際には、通常の 'Axes'オブジェクトのscatterメソッドを呼び出しています。 'ax = fig.add_subplot(111、projection = '3d')'で 'Axes3d'オブジェクトを作ってみてください。 –

+0

それを試して質問を更新しました –

答えて

5

をスローします。なぜ軸のカスタム目盛ラベルを設定するだけではないのですか?

import pandas as pd 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 

fig = plt.figure('scatter dates') 
ax = fig.add_subplot(111, projection='3d') 
dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"] 
dates_formatted = [pd.to_datetime(d) for d in dates ] 
x = [1,2,3,4] 
y = [9,10,11,12] 
z = [5,6,7,8] 

ax.scatter(x, y, z) 
ax.xaxis.set_ticks(x) 
ax.xaxis.set_ticklabels(dates_formatted) 
plt.show() 

enter image description here

+0

解決策を正しく理解していれば、 'x'の値のリストは' scatter() '関数のサポートされている値に適合するような任意の数になります。その後、 'x'軸のカスタムラベル(日付)を設定して値を並べ替えるだけで済みます。 –

+0

@MaTaKazerかなりそうです、はい。原則として、x値を時間文字列から直接計算することもできます。これは、より意味のある方法です。 –

2

散布番号を期待。今、あなたは、3Dプロットの

pyplot.scatter(x, y) 

としてデータをプロットすることができ

y = [ (d-min(dates_formatted)).days for d in dates_formatted] 

、あなたはこのような何かを試すことができます...

:だから、次のように番号とあなたの日付に変換することができます
import pandas as pd 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

plt.ion() 
x = [1,2,3,4] 
z = [5,6,7,8] 
dates = ['15/10/2016', '16/10/2016', "17/10/2015", "15/10/2014"] 
dates_formatted = [pd.to_datetime(d) for d in dates] 

y = [ (d-min(dates_formatted)).days for d in dates_formatted] 

fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
plt.scatter(x, y, z) 

y軸は現在の日数です。あなたは

dt = [ pd.Timedelta(d) + min(dates_formatted) for d in ax.get_yticks()] 

...文字列に

dtStr = [d.isoformat() for d in dt] 

をこれらを変換する...日付文字列を見つけて、戻ってそれを変更することで、これを変更し、私は疑う

ax.set_yticklabels(dtStr)