【matplotlib】(横棒グラフ)Excelで作るようなデザインのグラフを作りたい【python】

pythonでグラフを作るとき、自分好みのデザインにするのにいつも苦労する。

seabornもおしゃれでいいのだけど、みんなが使いすぎていてpython感が出すぎるので、Excelで作ったみたいなデザインにするにはどうするかを頑張ってみた。

今後自分のメモ用にいくつかのパターンを作ってみたいと思う。

 

今回はこの横棒グラフ。文字の配置や色味の調整を頑張ってみた。

 

import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib

#データ
sales_1 = np.array([153, 202, 355, 430])#棒グラフのデータ
sales_2 = np.array([53, 78, 100, 158])#点のデータ
labels = ['A', 'B', 'C', 'D']#x軸のラベル

#色
c_1 = '#b1cce4'#濃い色
c_2 = '#1991af'#薄い色
c_gray = "#777777" #軸の色
c_gray2 = "#aaaaaa"#薄いグレー

#サイズ
label_s1 = 15#軸等の文字サイズ

#グラフサイズ
fig_x = 6
fig_y = 4

fig = plt.figure(figsize=(fig_x,fig_y))#グラフの作成
ax1 = fig.add_subplot(111)#subplotの作成

#フォント指定
plt.rcParams['font.family'] = 'Meiryo'

#縦棒グラフ
bar_w = 0.5 #棒グラフの太さ
ind = np.arange(len(sales_1)) #要素の数
p1 = ax1.barh(ind, sales_1, color=c_1, label='売上', height=bar_w)#横棒グラフ
p2 = ax1.barh(ind, sales_2, color=c_2, label='営業利益', height=bar_w)#横棒グラフ
ax1.xaxis.tick_top()

#y軸
y_ticks_space = 0.75
y_ticks = [ind[0]-y_ticks_space, ind[-1]+y_ticks_space]
ax1.set_ylim(y_ticks[0], y_ticks[1])#y目盛の範囲
ax1.tick_params(axis='y', which='both', bottom=False, top=False, left=False, right=False)#ticksの目盛を消す
ax1.set_yticks(ind)
ax1.set_yticklabels(labels, fontsize=label_s1, color=c_gray)#y軸のラベルの設定

#x軸
x_ticks = [0,500]#軸ラベルの値
x_ticks_l = [0,100,200,300,400]
grid_w = 1
ax1.set_xlim(x_ticks[0], x_ticks[1])#x目盛の範囲
ax1.set_xticks(x_ticks_l, color=c_gray)#x軸目盛線の設定
ax1.set_xticklabels(x_ticks_l, fontsize=label_s1, color=c_gray)#x軸目目盛ラベルの設定
ax1.grid(axis="x", lw=1, c=c_gray2)#x軸目盛線をありに

#フォント指定
plt.rcParams['font.family'] = 'Meiryo'
plt.gca().invert_yaxis()  # y軸を反転

#枠線を消す
spine_w = 1
ax1.spines['top'].set_linewidth(spine_w)
ax1.spines['top'].set_color(c_gray)
ax1.spines['bottom'].set_linewidth(0)
ax1.spines['left'].set_linewidth(spine_w)
ax1.spines['left'].set_color(c_gray)
ax1.spines['right'].set_linewidth(0)

#y軸の単位を加える
fig.text(0.8, 0.933, '(億円)', ha='left', va='center', color=c_gray , fontsize= label_s1)#y軸単位

#凡例
ax1.legend(loc='lower left', fontsize=label_s1, bbox_to_anchor=(0.6,0.7), labelcolor=c_gray, facecolor='white', framealpha=1, frameon=True, edgecolor="white")#棒グラフの凡例

# 売上の数値を棒グラフの上に表示
for rect in p1:
    height = rect.get_height()
    width = rect.get_width()
    ax1.text(width-10, rect.get_y() + rect.get_height()/2, 
            '%d' % int(width), ha='right', va='center', color=c_gray, fontweight='bold', fontsize=label_s1)

for rect in p2:
    height = rect.get_height()
    width = rect.get_width()
    ax1.text(width-10, rect.get_y() + rect.get_height()/2, 
            '%d' % int(width), ha='right', va='center', color="#ffffff", fontweight='bold', fontsize=label_s1)