4
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

matplotlibで特定のデータにだけマーカーを適用する方法

Posted at

#はじめに
雑誌の掲載順をグラフ化するときに、matplotlibで特定の項目にだけマーカー(グラフに打つ点)をつけたくなった(センターカラーのときにだけわかりやすいように目印をつけたかった)が、探しても全く出てこなかったのでメモ。
max_2020.png
↑こんな感じで強調するために特定の値の時だけマーカーを適用したかった。

#環境

$ uname -a                                                                                                                              
Linux kali 4.18.0-kali2-amd64 #1 SMP Debian 4.18.10-2kali1 (2018-10-09) x86_64 GNU/Linux

$ python3 --version                                                                                                                             
Python 3.7.6

$ pip3 show matplotlib                                                                                                                         
Name: matplotlib
Version: 3.1.2

#問題
例えば、以下のようなデータがあったとする。

|month|1月|2月|3月|4月|5月|6月|7月|8月|9月|10月|11月|12月|
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
|data|13|15|21|5|10|18|21|17|15|16|21|13|

これらをグラフにするとこうなる。
before.png

このグラフの1,4,7,10月のデータにだけダイヤモンドでマーカーを付けたい(その他には付けたくない)ときどうすればいいだろうか。

#解決法
マーカーを付けたい部分だけを配列にしてプロットするときにmarkevery=で渡す。
X番目にマーカーを付けたければX-1番目の数を配列に追加する。

こんな感じ。

#!/usr/bin/env python 
import matplotlib.pyplot as plt
 
X_data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Y_data=[13,15,21,5,10,18,21,17,15,16,21,13]
month_name=['Jan.','Feb.','Mar.','Apr.','May','Jun.','Jul.','Aug.','Sep.','Oct.','Nov.','Dec.']
mark_point=[0,3,6,9]

plt.xlabel('month')
plt.ylabel('data')

plt.grid(color='gray')
plt.xticks(X_data,month_name)
plt.yticks(range(1,max(Y_data)+1))
plt.plot(X_data,Y_data, '.', linestyle='solid', marker="D", markevery=mark_point)
plt.show()

結果
markeevery1.png

y軸のデータを基準にしたければ、先にデータを比較して配列に格納すれば良い。
例)データが奇数のときだけマーカーを適応する

#!/usr/bin/env python 
import matplotlib.pyplot as plt
 
X_data=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
Y_data=[13,15,21,5,10,18,21,17,15,16,21,13]
month_name=['Jan.','Feb.','Mar.','Apr.','May','Jun.','Jul.','Aug.','Sep.','Oct.','Nov.','Dec.']
mark_point=[]

for i,data in enumerate(Y_data):
    if data%2:
        mark_point.append(i)

plt.xlabel('month')
plt.ylabel('data')

plt.grid(color='gray')
plt.xticks(X_data,month_name)
plt.yticks(range(1,max(Y_data)+1))
plt.plot(X_data,Y_data, '.', linestyle='solid', marker="D", markevery=mark_point)
plt.show()

結果
markeevery2.png

一件落着。
#参考文献
Markevery Demo — Matplotlib 3.1.2 documentation

4
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?