teratail header banner
teratail header banner
質問するログイン新規登録
Python

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

Q&A

解決済

3回答

181閲覧

一方のグラフの点の色を踏まえて、もう一方のグラフの点の色を自動設定したい

yyicp

総合スコア77

Python

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

1グッド

0クリップ

投稿2025/07/07 06:09

1

0

実現したいこと

ディレクトリ構造は以下のようになっています。
pref1
├a.csv
├b.csv
├c.csv
├source.py

pref2
├b.csv
├c.csv
├d.csv
├source.py

a、b、c、dはデータ名です。
分かりにくくて申し訳ありませんが、例えば、pref1のときのb.csvとpref2のときのb.csvはファイル名同じですが別の数値が入っています。

pref1の中のb.csv
X Y
200 3
300 3.6

pref2の中のb.csv
X Y
600 3.4
700 2.8

「該当のソースコード」を実行すると、prefの値(1か2)で分けて2つの図が出力されます。

pref1のとき、図1とします。
イメージ説明

pref2のとき、図2とします。
イメージ説明

図1のマーカーの色は自動設定になっています。
図2のマーカーの色を図1を踏まえて自動設定にする方法はありますでしょうか。
図1の色がa, b, cの順に青、オレンジ、緑なので、図2の色をb, c, dの順にオレンジ、緑、(その次の自動設定で決まる色)にしたいです。

1つ1つ手動で色を設定するのは間違えそうなので、できるだけ自動設定機能を利用したいです。

該当のソースコード

python

1import pandas as pd 2import numpy as np 3import csv 4import matplotlib.pyplot as plt 5 6pref = 2 7if pref==1: 8 setxmin = 0 9 setxmax = 500 10 setymin = 2.6 11 setymax = 4.0 12 savename='result1.jpg' 13 data_name = ['a', 'b', 'c'] 14 15elif pref==2: 16 setxmin = 500 17 setxmax = 1000 18 setymin = 2.6 19 setymax = 4 20 savename='result2.jpg' 21 data_name = ['b', 'c', 'd'] 22 23plt.rcParams['mathtext.fontset'] = 'stix' 24fig, ax = plt.subplots() 25 26for i, dn in enumerate(data_name): 27 df = pd.read_csv(dn + '.csv') 28 ax.plot('X', 'Y', data=df, marker='o', label=dn, linestyle='None') 29 30ax.set_xlabel('$X$',fontsize=15, fontname="Times New Roman") 31ax.set_ylabel('$Y$',fontsize=15, fontname="Times New Roman") 32ax.grid() 33ax.legend(loc='upper left', bbox_to_anchor=(1.05, 1), fontsize=18) 34ax.set_xlim([setxmin,setxmax]) 35ax.set_ylim([setymin,setymax]) 36plt.tick_params(labelsize=11) 37plt.tight_layout() 38plt.savefig(savename) 39plt.show()

試したこと

予めファイル名と色を対応させておくのかなと思いましたが、よく分かりませんでした。

melian👍を押しています

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

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

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

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

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

guest

回答3

0

colorとして C0とかC1を指定すれば、パレットの0番目、1番目という意味になるので、以下のように書けます。

python

1all_data_name = ['a', 'b', 'c', 'd'] 2colors = {dn: f'C{i}' for i, dn in enumerate(all_data_name)} 3 4ax.plot('X', 'Y', data=df, marker='o', c=colors[dn], label=dn, linestyle='none')

https://matplotlib.org/stable/users/explain/colors/colors.html#cn-color-selection
(10個以上データがある場合はもうちょっと工夫しないといけないですね)

投稿2025/07/07 08:26

bsdfan

総合スコア4925

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

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

yyicp

2025/07/07 08:46

できました。 どうもありがとうございました。
guest

0

ベストアンサー

デフォルトのカラーサイクルは plt.rcParams['axes.prop_cycle'].by_key()['color'] で取得することができますので、それとデータファイル名との辞書(dict)を作成します。ただ、カラーサイクルは10種類なのでデータが10個よりも多い場合は同じ色のデータが混在することになります。その点にご留意ください。

python

1pref1_data_name = ['a', 'b', 'c'] 2pref2_data_name = ['b', 'c', 'd'] 3 4data = sorted(set(pref1_data_name + pref2_data_name)) 5default_color_cycle = plt.rcParams['axes.prop_cycle'].by_key()['color'] 6colors_dict = dict(zip(data, default_color_cycle)) 7 8pref = 1 9if pref==1: 10 setxmin = 0 11 setxmax = 500 12 setymin = 2.6 13 setymax = 4.0 14 savename='result1.jpg' 15 data_name = pref1_data_name 16 17elif pref==2: 18 setxmin = 500 19 setxmax = 1000 20 setymin = 2.6 21 setymax = 4 22 savename='result2.jpg' 23 data_name = pref2_data_name 24 25plt.rcParams['mathtext.fontset'] = 'stix' 26fig, ax = plt.subplots() 27 28for i, dn in enumerate(data_name): 29 df = pd.read_csv(dn + '.csv') 30 ax.plot(df['X'], df['Y'], marker='o', label=dn, linestyle='None', color=colors_dict[dn])

イメージ説明

投稿2025/07/07 08:26

melian

総合スコア21285

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

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

yyicp

2025/07/07 08:39

できました。 どうもありがとうございました。
guest

0

予めファイル名と色を対応させておく

であれば、とりあえずこんな感じでしょうか。

データ名と色の対応を辞書で作る

python

1 2color = { 3 'a': '#000000', 4 'b': '#0000ff', 5 'c': '#006400', 6 'd': '#7fff00' 7 }

プロットするときに、色を指定する。

python

1ax.plot( 2 'X', 'Y', 3 data=df, 4 marker='o', 5 c=color[dn], 6 label=dn, 7 linestyle='None')

投稿2025/07/07 07:33

TakaiY

総合スコア14542

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

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

yyicp

2025/07/07 07:42

できました。 どうもありがとうございました。 自動設定の色をそのまま使えると、より嬉しいです。 つまり、aを自動設定の一番目の色、bを自動設定の二番目の色、cを自動設定の三番目の色、dを自動設定の四番目の色、という感じです。
TakaiY

2025/07/07 08:42

> 自動設定の色をそのまま使えると、より嬉しいです なぜですか?
yyicp

2025/07/07 08:49

自分で色を指定する手間が省けるから、と思っているのですが もしかして私、何かおかしな考え方をしていますでしょうか。
TakaiY

2025/07/07 09:04

であれば、他の方の回答にあるとおりにすれば、デフォルトのカラーマップが取得できます。
yyicp

2025/07/08 00:51

ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問