lotkav
@lotkav

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

データプロットしたグラフ塗りつぶし

解決したいこと

下記のデータを書き込んだだけのグラフの領域ごとに塗りつぶしたいのですが、
コードの書き方が分かりません。
関数でもなく直線でもないものを ax.fill_between や span を
使ってうまく書けず困っています。
初歩的な部分で申し訳ないですがご教授いただければ幸いです。
image.png

該当するソースコード

import matplotlib.pyplot as plt

x1=[0.38,0.39,0.4,0.41,0.42,0.43,0.44,0.45,0.46,0.47,0.48,0.49,0.5,0.51,0.52,0.53,0.54,0.55,0.56,0.57,0.58,0.59,0.6,0.61,0.62,0.75,0.8,0.84,0.85,0.9,0.95,0.97,0.98]
x2=[0.62,0.63,0.64,0.65,0.66,0.67,0.68,0.69,0.7,0.71,0.72,0.73,0.74,0.75,0.8,0.84,0.85,0.9,0.95,0.97,0.98]
y1=[19492,3932,1839,1108,756,556,429,343,282,237,202,175,153,135,121,109,98,90,83,76,71,67,63,59,56,35,31,29,29,18,7,4,0]
y2=[9286,1695,794,487,340,256,203,167,140,121,105,93,83,75,48,35,32,18,7,4,0]
x3=[0.98,0.98]         
y3=[0,30000]

plt.plot(x1,y1,color="c")
plt.plot(x2,y2,color="b")
plt.plot(x3,y3)  


plt.xlabel("$dk$")
plt.ylabel("$dt$")        
plt.axis([0,1.1, 0,1500])

plt.show()
0

2Answer

ax.fill_betweenを使ってy=0との間に色を塗るには、

import matplotlib.pyplot as plt

x1=[0.38,0.39,0.4,0.41,0.42,0.43,0.44,0.45,0.46,0.47,0.48,0.49,0.5,0.51,0.52,0.53,0.54,0.55,0.56,0.57,0.58,0.59,0.6,0.61,0.62,0.75,0.8,0.84,0.85,0.9,0.95,0.97,0.98]
x2=[0.62,0.63,0.64,0.65,0.66,0.67,0.68,0.69,0.7,0.71,0.72,0.73,0.74,0.75,0.8,0.84,0.85,0.9,0.95,0.97,0.98]
y1=[19492,3932,1839,1108,756,556,429,343,282,237,202,175,153,135,121,109,98,90,83,76,71,67,63,59,56,35,31,29,29,18,7,4,0]
y2=[9286,1695,794,487,340,256,203,167,140,121,105,93,83,75,48,35,32,18,7,4,0]
x3=[0.98,0.98]         
y3=[0,30000] 

fig, ax = plt.subplots()
y0_for_x1 = [0 for _ in range(len(x1))]
ax.fill_between(x1, y1, y0_for_x1, color="c")

y0_for_x2 = [0 for _ in range(len(x2))]
ax.fill_between(x2, y2, y0_for_x2, color="b")
ax.plot(x3,y3)

ax.set_xlabel("$dk$")
ax.set_ylabel("$dt$")        
plt.axis([0,1.1, 0,1500])

plt.show()

Unknown-60.png

こんな感じでどうでしょうか。
コードのポイントとしては、y0_for_x1 = [0 for _ in range(len(x1))]でx1と同じ個数の0の配列を作り、y1とy0の間を塗るようにするとできます。

0Like

Comments

  1. @lotkav

    Questioner

    ご回答ありがとうございます。
    コードとても参考になりました。
    y1とy0、y2とy0を塗りつぶすことができました。
    重ねてお伺いしたいのですが、y2とy0ではなく、y2とy1の間を塗りつぶすにはどうしたらいいでしょうか。
    グラフでいうと下の方の水色の部分が青色に塗りつぶされてしまっていますが、
    重ならないようにしたいです。
    立て続けに申し訳ないですが、ご教授いただければ幸いです。

y2とy1の間を塗りつぶすには塗る順番を入れ替えると良いと思います。

import matplotlib.pyplot as plt

x1=[0.38,0.39,0.4,0.41,0.42,0.43,0.44,0.45,0.46,0.47,0.48,0.49,0.5,0.51,0.52,0.53,0.54,0.55,0.56,0.57,0.58,0.59,0.6,0.61,0.62,0.75,0.8,0.84,0.85,0.9,0.95,0.97,0.98]
x2=[0.62,0.63,0.64,0.65,0.66,0.67,0.68,0.69,0.7,0.71,0.72,0.73,0.74,0.75,0.8,0.84,0.85,0.9,0.95,0.97,0.98]
y1=[19492,3932,1839,1108,756,556,429,343,282,237,202,175,153,135,121,109,98,90,83,76,71,67,63,59,56,35,31,29,29,18,7,4,0]
y2=[9286,1695,794,487,340,256,203,167,140,121,105,93,83,75,48,35,32,18,7,4,0]
x3=[0.98,0.98]         
y3=[0,30000] 

fig, ax = plt.subplots()
y0_for_x2 = [0 for _ in range(len(x2))]
ax.fill_between(x2, y2, y0_for_x2, color="b")

y0_for_x1 = [0 for _ in range(len(x1))]
ax.fill_between(x1, y1, y0_for_x1, color="c")
ax.plot(x3,y3)

ax.set_xlabel("$dk$")
ax.set_ylabel("$dt$")        
plt.axis([0,1.1, 0,1500])

plt.show()

Unknown-61.png

補足ですが、x1とx2のプロットが共通であればax.fill_between(x1, y1, y2)みたいにできますが、今回はそうでないようでこの方法が良いと思います。

0Like

Comments

  1. @lotkav

    Questioner

    なるほどです!
    とても助かりました。
    目指していたものができました。
    教えていただきありがとうございました!

Your answer might help someone💌