質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

5177閲覧

python 3次元グラフの軸を対数表示にしたい

nobu30

総合スコア7

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/05/05 04:30

前提・実現したいこと

pythonでパワースペクトルのグラフを作成しています。今x軸とz軸を対数表示に変えたいのですが以下のコードだとエラーがでてしまいます。もし解決方法が分かれば教えてください。
軸のスケールを設定しない場合は以下のグラフが出力されます。
軸の設定をせずに出力したグラフ

エラーメッセージ

'Axes3DSubplot' object has no attribute 'xscale'

該当のソースコード

import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D import numpy as np from scipy import fftpack import os import csv """" ここにFFTの計算のコードがあります。 """" """ ここからグラフ作成のコード """ fig=plt.figure() ax=fig.gca(projection="3d") for i in range (0,7): ii=i*4 ax.plot(freq0[1:int(linenumber/2)],XD0[1:int(linenumber/2),ii],Pf[1:int(linenumber/2),ii]) plt.rcParams['font.family'] = 'Times New Roman'#グラフのフォント plt.rcParams['mathtext.fontset'] = 'cm'#テキストのフォント(斜体部分) ax.set_xlabel("$f$"+" [Hz]", fontsize=13) ax.set_zlabel( '$P(f)$'+ ' [m$^{2}$/s$^{2}$]', fontsize=13) ax.set_ylabel("$x/D_{0}$"+ ' [-]', fontsize=13) plt.tight_layout() plt.xscale('log') plt.zscale('log') plt.savefig('Power spectral',dpi=200) plt.show()

試したこと

plt.xscale('log')を
plt.set_xscale('log')や
ax.xaxis.set_scale('log')に変えましたがエラーが出てきます。

補足情報(FW/ツールのバージョンなど)

python3.6(spyder)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ax.xaxis.set_scale('log')はmatplotlibの古いバージョンでは動いていただろうと思います。

https://matplotlib.org/api/api_changes.html
を見ますと1.5.0でAPIが変更になりAxis.set_scaleは使えなくなったと書いてありますね。

Axis

Removed method set_scale. This is now handled via a private method which should not be used directly by users. It is called via Axes.set_{x,y}scale which takes care of ensuring the related changes are also made to the Axes object.

自分の環境では、上の記述どおりにすればz軸を対数目盛にできました。

ax.set_zscale('log')

「メソッドがない」というエラーの場合、あてずっぽうで「こうしてみたらどうだろう」とやるよリファレンス(一次情報源)を確認した方が早いと思います。

なおx, zの2つの軸を対数にするとプロット領域に何もでてきませんでした。自分が試したプロットデータの値がまずかったのかも知れませんが、そこは追及してません。

Windows 10 64bit
Python 3.6.5(公式実装)
matplotlib 2.0.0

投稿2018/05/05 09:35

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

python - Plotting mplot3d / axes3D xyz surface plot with log scale? - Stack Overflow

Since I encountered the same question and Alejandros answer did not produced the desired Results here is what i found out so far.

The log scaling for Axes in 3D is an ongoing issue in matplotlib. Currently you can only relabel the axes with:

ax.yaxis.set_scale('log')
This will however not cause the axes to be scaled logarithmic but labeled logarithmic. ax.set_yscale('log') will cause an exception in 3D

ということらしいです。

投稿2018/05/05 09:15

編集2018/05/05 09:15
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/05/05 09:38 編集

あわ・・・かぶってしまいました。失礼しました。 --- ・・・よくみると情報が微妙にちがってるのかな?
hayataka2049

2018/05/05 09:41 編集

これ、バージョンによるって話だったんですか。そしたら質問者様も使ってる環境からして、おそらくax.set_zscale()あたりですかね、ということか --- そちらの回答の方が情報的に良いと思うので、評価上げておきます
KSwordOfHaste

2018/05/05 09:42

「The log scaling for Axes in 3D is an ongoing issue」 ここ着目した方がいいかと思いました。 x, zの2つを指定すると画面が真っ白になるのですがどうも腑に落ちないのです><
nobu30

2018/05/05 09:55

ご回答ありがとうございます。 また,ax.set_zscale()で軸は変わりましたけどプロットグラフはかわらないんですね><
hayataka2049

2018/05/05 09:56

いや、単に私が貼ったやつが古かっただけ(よく見たら7年前だし。反省)・・・で今はできてるんだと思いますが、 確かになんかうまく表示されませんね。出るには出るけど、両脇に寄っちゃいました
hayataka2049

2018/05/05 09:57

>プロットグラフはかわらない そういうことか・・・いや、そんなバカな。調べます
nobu30

2018/05/05 09:59

軸が対数になってもグラフの形はかわっていませんでした・・・
KSwordOfHaste

2018/05/05 10:00

set_?scaleはそういう機能なんだろうなと思いました。スケール=目盛りなんで。
nobu30

2018/05/05 10:03

解決していないんですね・・・ 情報ありがとうございます グラフ作成ソフトさがしてみます・・・><
KSwordOfHaste

2018/05/05 10:04

なるほど2Dでのsemilogyのような機能を期待されてたということだったんですね。これもかなり昔からの問題みたいですね!
hayataka2049

2018/05/05 10:10

2dだとset_*scaleで意図通り動くので、理不尽な話ではあります
nobu30

2018/05/05 10:11

そうですね 2Dのグラフを重ねて表示したかったです・・・
nobu30

2018/05/05 10:12

いろいろご回答ありがとうございました
KSwordOfHaste

2018/05/05 10:20

> 理不尽 なるほど・・・「The log scaling for Axes in 3D is an ongoing issue」はやっぱり今でも継続中と捉えた方がよさそうなのですかね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問