openpyxlで縦軸が2つあるグラフを作成した結果,2つ目の縦軸が表示されない
解決したいこと
openpyxlで,データが記載されているExcelファイルを読み込んで,系列が2つあるグラフを自動で作成したのですが,その際2つの系列ををそれぞれ別の縦軸で表記するようにしています。
エラーなどはなく動いたのですが,結果のグラフで2つ目の縦軸が表示されない問題が起こっています。
発生している問題・エラー
ソースコードのように,まずは2つグラフを作成し,その後で2つのグラフを合成するという方法を取っています。
ですが,作成されたグラフの方が下図のように,右側の縦軸が一切表示されない状態になってしまいます。
なにか解決策などありましたらご教授願います。
該当するソースコード
#別のxlsxファイルから,縦軸が2つのグラフを作成するプログラム
import openpyxl
import glob
import re
from openpyxl.chart import ScatterChart, LineChart, Reference, Series
from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.chart.layout import Layout, ManualLayout
from openpyxl.chart.label import DataLabel, DataLabelList
from openpyxl.chart.text import RichText
from openpyxl.drawing.text import Paragraph, ParagraphProperties, CharacterProperties, Font, RichTextProperties
from openpyxl.drawing.fill import PatternFillProperties, ColorChoice
from openpyxl.drawing.line import LineProperties
from openpyxl.chart.axis import Scaling
from copy import deepcopy
#元となるxlsxファイル
files= glob.glob("*smry.xlsx")
print(files)
for file in files:
print(file)
#xlsxファイルを開く
wb = openpyxl.load_workbook(file)
for ws in wb.worksheets:
temp = ws.title
print(temp)
temp = int(temp)
temp_min = temp - 50
temp_max = temp + 50
#項目が記された1行目をリストとして取得
titles = []
titles1 = ws[1]
#print(titles1)
for title1 in titles1:
titles.append(title1.value)
#print(titles)
#各項目のインデックスを取得
ag = titles.index("angles")
r = titles.index("平均半径")
C8H18 = titles.index("hdiffx_ave")
O2 = titles.index("hdiffy_ave")
h = titles.index("hdiffz_ave")
#第1軸のグラフ作成
chart_h_O2 = ScatterChart()
#chart_t.title = ""
chart_h_O2.x_axis.title = "Angular cordinate [deg.] (from"+ str(temp_min) + "K to " + str(temp_max) + "K)"
chart_h_O2.x_axis.scaling = Scaling(min = 0, max = 360)
chart_h_O2.x_axis.majorUnit = 30
chart_h_O2.y_axis.title = "Thermo diffusion [J/m^3/s]"
chart_h_O2.y_axis.scaling = Scaling(min = 1.0E+6, max = 1.0E+12)
chart_h_O2.y_axis.scaling.logBase = 10
chart_h_O2.y_axis.numFmt = "0.00E+00"
chart_h_O2.x_axis.spPr = GraphicalProperties(ln =LineProperties(solidFill="E6E6E6", w=1*12700))
chart_h_O2.y_axis.spPr = GraphicalProperties(ln =LineProperties(solidFill="E6E6E6", w=1*12700))
chart_h_O2.x_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill= "E6E6E6", w=0.01*12700))
chart_h_O2.y_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill= "E6E6E6", w=0.01*12700))
#第2軸のグラフ作成
chart_O2_2 = ScatterChart()
#chart_C8H18.title = "O2拡散量"
#chart_O2.x_axis.title = "Angular cordinate [deg.] (from"+ str(temp_min) + "K to " + str(temp_max) + "K)"
chart_O2_2.y_axis.title = "O2 diffusion [kg/m^3/s]"
chart_O2_2.y_axis.numFmt = "0.00E+00"
#chart_O2.x_axis.spPr = GraphicalProperties(ln =LineProperties(solidFill="E6E6E6", w=1*12700))
chart_O2_2.y_axis.spPr = GraphicalProperties(ln =LineProperties(solidFill="E6E6E6", w=1*12700))
#chart_O2.x_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill= "E6E6E6", w=0.01*12700))
chart_O2_2.y_axis.majorGridlines.spPr = GraphicalProperties(ln=LineProperties(solidFill= "E6E6E6", w=0.01*12700))
# 凡例の配置位置
#chart1.legend.position = 'b'
#r,l,t,b and tr for right, left, top, bottom and top right. default is right.
nrow=ws.max_row
ncol=ws.max_column
# 系列のY軸の値の参照する
thermovalues = Reference(ws, min_col=h+1, max_col=h+1, min_row=2, max_row=73)
O2values = Reference(ws, min_col=O2+1, max_col=O2+1, min_row=2, max_row=73)
# 系列のX軸の値の参照する
agvalues = Reference(ws, min_col=ag+1, max_col=ag+1, min_row=2, max_row=73)
# 系列のデータをSeriesオブジェクトとして定義する
series_h = Series(thermovalues, agvalues, title = "Thermo diffusion")
series_O2 = Series(O2values, agvalues, title = "O2 diffusion" )
serieslist = [series_h, series_O2]
# マーカーを塗り潰す色を同様に辞書形式で用意
# 色の指定はRGBのHex指定とColorChoiceオブジェクト指定による2タイプで指定
#marker_solidFill = {1:"00bFFF", 2:"FF4500", 3:"FFF0F",
# 4:ColorChoice(prstClr="midnightBlue"),
# 5:ColorChoice(prstClr="yellowGreen"),
# 6:ColorChoice(prstClr="cornflowerBlue")}
#各系列のマーカーの形状,色を指定
marker_solidFill = {1:"4169e1", 2:"ffc0cb"}
marker_linesolidFill = {1:"191970", 2:"ff4500"}
for i, obj in enumerate(serieslist, 1):
# ラインの設定
#obj.graphicalProperties.line.noFill = True
obj.spPr.ln.solidFill = marker_linesolidFill[i]
# 以下マーカーの設定
obj.marker.symbol = "circle" # シンボルを指定
obj.marker.size = 5 # サイズを指定
obj.marker.graphicalProperties.solidFill = marker_solidFill[i] # 塗りつぶし色
obj.marker.graphicalProperties.line.solidFill = marker_linesolidFill[i] # 枠線色
#各系列をグラフに追加
chart_h_O2.series.append(series_h)
chart_O2_2.series.append(series_O2)
chart_h_O2.legend.legendPos = "r"
#グラフ合成
chart_h_O2 += chart_O2_2
#2つめのグラフのy軸を右寄せ
chart_O2_2.x_axis.crosses = "max"
#元のxlsxファイルにグラフを追加
ws.add_chart(chart_h_O2, 'AH2')
wb.save(file)
wb.close
自分で試したこと
グラフ合成のタイミングや凡例の位置などを変えてみるなどしましたが,結果は特に変わりませんでした。
0 likes